Files
Eric Seidel 34509fca3c refactor: split C API into Dart and engine surfaces (#350)
The C surface in `library/src/c_api` was a single bucket of `pub extern "C"`
functions covering both consumers — `package:shorebird_code_push` (via
ffigen) and Shorebird's Flutter engine fork (via direct C++ link). That
made it hard to reason about which symbols are stable ABI versus
internal, and ffigen was generating bindings for engine-only symbols
that no Dart code calls.

Split into two self-contained submodules and two cbindgen-generated
headers:

- `c_api::dart` → `include/updater_dart.h` (stable ABI; ffigen entry
  point). Defines `UpdateResult`, the `SHOREBIRD_*` status constants, and
  the five Dart-stable functions: `shorebird_current_boot_patch_number`,
  `shorebird_next_boot_patch_number`,
  `shorebird_check_for_downloadable_update`,
  `shorebird_update_with_result`, `shorebird_free_update_result`.
- `c_api::engine` → `include/updater_engine.h` (no stability guarantee).
  Defines `AppParameters`, `FileCallbacks`, and the engine-only functions:
  `shorebird_init`, `shorebird_should_auto_update`,
  `shorebird_validate_next_boot_patch`, `shorebird_next_boot_patch_path`,
  `shorebird_free_string`, `shorebird_start_update_thread`, and the
  `shorebird_report_launch_*` trio.

Each bucket file is self-contained: cbindgen scans only the file
(`with_src` in build.rs) and emits the items it defines plus the C
types they reference. There are no exclude/include lists in the
cbindgen configs — adding a function to one bucket automatically lands
it in the right header, and items in the other bucket cannot leak.

`mod.rs` shrinks to a thin layer of private helpers shared by both
buckets (`to_rust`, `allocate_c_string`, `free_c_string`, `log_on_error`)
plus the test module.

`include/updater.h` is removed; consumers include the specific header
for their use case. The Flutter engine's
`shell/common/shorebird/updater.cc` will be updated in a follow-up
engine-repo PR to include `updater_engine.h` directly.

Also drops two retired Dart-side symbols:

- `shorebird_update` (replaced by `shorebird_update_with_result` in the
  Dart 2.0 rewrite, Nov 2024).
- `shorebird_check_for_update` (replaced by
  `shorebird_check_for_downloadable_update` in the same rewrite).

The shorebird_code_push package's `_legacyFallback` was the only path
that still called `shorebird_update`. The package's `flutter: >=3.24.5`
constraint guarantees the engine has `shorebird_update_with_result`, so
the fallback was unreachable in practice. Removing it lets us drop the
ABI symbol.

Bumps shorebird_code_push to 2.0.7. Bindings regenerated via ffigen now
contain only the five Dart-stable symbols.

Follow-up engine PR will: include `updater_engine.h` instead of the
removed `updater.h`; clean up `android_exports.lst` (drop the ghost
`shorebird_active_path` and `shorebird_active_patch_number` exports,
drop `shorebird_check_for_update`).
2026-05-04 15:56:09 -07:00

2.5 KiB

2.0.7

  • chore: internal cleanup; no public API changes.

2.0.6

  • fix: checkForUpdate now reports restartRequired when the current patch has been rolled back
  • fix: update no longer throws UpdateException when no new patch is available to install
  • fix: update no longer throws UpdateException when another update is already in progress
  • docs: warn that checkForUpdate and update make network calls and may block app startup if awaited synchronously

2.0.5

  • docs: fix Discord badge in README.md

2.0.4

  • feat: allow for custom UpdateTrack names in addition to stable, staging, and beta

2.0.3

  • feat: override toString in ReadPatchException and UpdateException

2.0.2

  • fix: un-break web platform
  • chore: minor improvements to example

2.0.1

  • Update the minimum Flutter version from 3.24.4 to 3.24.5 (3.24.4 does not include the updater changes required to support the new API).

2.0.0

  • BREAKING: more updates to the Updater API. We now support Stable, Beta, and Staging tracks for patches, meaning you have more control over who gets your patches and when. Check out the example for a demo.

2.0.0-dev.2

  • fix: tighten library exports

2.0.0-dev.1

  • BREAKING: revamp the updater API
    • Remove ShorebirdCodePush in favor of ShorebirdUpdater

1.1.6

  • Update log messages to explain what "using no-op implementation" means.

1.1.5

  • Update example to use isNewPatchReadyToInstall.

1.1.4

  • Run dart format over generated files to appease pub static analysis.

1.1.3

  • Update README to improve example.
  • Remove confusing log message printed when Shorebird is not available.

1.1.2

  • update README

1.1.1

  • break: package:shorebird_code_push/shorebird_code_push_io.dart and package:shorebird_code_push/shorebird_code_push_web.dart have moved into src/ to discourage accidental direct import of these files. Please import package:shorebird_code_push/shorebird_code_push.dart instead.
  • Fixes repository link in pubspec.yaml

1.1.0

  • feat: introduce isShorebirdAvailable to determine whether the Shorebird Engine is detected
  • fix: crashes when running Flutter application on web
  • docs: improvements to example app

1.0.0

  • Change downloadUpdate to downloadUpdateIfAvailable, as the Updater performs this check internally anyway.

0.1.3

  • Ignore some lints in generated files to make pub.dev happy

0.1.2

  • Improves documentation
  • Improves example, adds restart button to readme

0.1.1

  • Add readiness warning to README

0.1.0

  • Initial release 🎉