dart_cpp_bridge 2.2.0
dart_cpp_bridge: ^2.2.0 copied to clipboard
Dart ↔ C++20 bridge (FRB-like). Dart FFI session layer; Native Assets build hooks for Android, iOS, Linux, macOS, and Windows.
2.2.0 #
- Added configurable io scheduler runner count through
DartCppBridge.initand Native Assets-generated bindings; the default remains one runner. - Added a runtime deadlock guard and documented the multi-runner boundary for
raw
stdexec::sync_waitcalls.
2.1.1 #
- Hardened runtime lifecycle, C bridge completion, Native Assets target selection, and stdexec fixture integration.
- Added fail-fast codegen validation for Dart names and method-ID collisions.
2.1.0 #
- Fixed opaque-object finalization on 32-bit targets by using an ABI-safe native token that preserves the complete 64-bit handle.
- Opaque-object dispatch now validates that handles belong to the current isolate session.
- Async invocation failures now complete pending Dart
Futures with an error instead of leaving them pending forever. - Persistent DartFn registrations replace the previous closure for the same generated key, preventing unbounded per-session callback retention.
2.0.0 #
-
Breaking (C++ async API): migrated the runtime and generated async dispatch from async-simple to stdexec senders and
stdexec::task. The Dart API, C ABI, wire protocol, and generated file contracts remain compatible, but C++ business APIs must use the stdexec model. -
hook.dart:WindowsConfignow supports two non-MSVC compilers viaWindowsCompiler:clangCl— LLVMclang-cl, the MSVC-compatible clang driver. WithCmakeGenerator.ninja(the default whengeneratorisnull), the builder initializes the MSVC environment viavcvarsall.batfirst, then locates clang-cl: an explicitWindowsConfig.clangClPathwins, then a VS-bundled clang-cl (visible on the vcvars PATH when the "C++ Clang tools for Windows" component is installed), thenPATH/ LLVM installs / the LLVM registry key. The resolved compiler is passed via-DCMAKE_C(XX)_COMPILER=<clang-cl>. WithCmakeGenerator.msbuild, the builder passes-T clangcl.msys2Clang/msys2Gcc— GNU/MinGW-style MSYS2 ucrt64 clang / gcc (x86_64-w64-windows-gnutarget). The builder resolves the MSYS2 root viaWindowsConfig.msys2Path/MSYS2_ROOT/ well-known install locations and passes-DCMAKE_C(XX)_COMPILER=<msys2>\ucrt64\bin\ clang(++).exe(orgcc(++).exe) with the Ninja generator; no vcvars environment is needed. By default the C++ runtime is statically linked into the DLL (WindowsConfig.staticRuntime), producing a self-contained DLL with no MSYS2 runtime DLL dependency — noPATHsetup needed at runtime. WithstaticRuntime: falsethe MSYS2 runtime DLLs (libgcc_s_seh-1.dll,libstdc++-6.dll,libwinpthread-1.dll) are bundled next to the output whenbundleCrtistrue.
-
Native build:
dart/native/CMakeLists.txtand the example CMakeLists now use compiler-appropriate UTF-8 flags (/utf-8for MSVC/clang-cl,-finput-charset=UTF-8 -fexec-charset=UTF-8for GNU-style compilers) and linkws2_32/mswsockon non-MSVC Windows toolchains (asio requires Winsock).DcbCMakeBuilderartifact lookup also probes the MinGWlibprefix (lib<name>.dll).
1.3.0 #
- New:
BRIDGE_SYNCfunctions can now takestd::optional<dcb::StreamSink<T>>parameters. Sync calls can emit stream events (typically by spawning a coroutine that sends them asynchronously); Dart receives the events from the reply port queue right after the blocking FFI call returns. The generated Dart API takes aStreamController<T>?input parameter and stays synchronous, backed by the newDartCppBridge.invokeSyncMethodWithStream. - Streams: functions with a
dcb::StreamSink<T>parameter are generated as DartStream<T>when they also carry an export marker (BRIDGE_SYNC/BRIDGE_ASYNC/BRIDGE_NORMAL, typicallyBRIDGE_NORMAL). The parser warns and skips sink-only functions without an export marker. StreamSinknow holds astd::shared_ptr<Session>, so a long-lived sink stays safe even after its session is closed: lateadd()/end()/error()calls are silently dropped by the generation check instead of touching a destroyed session.co::mpsc/co::oneshotrecv()awaiters now hold ashared_ptrto the channel state, so the state stays alive even if the receiver is destroyed or moved while a coroutine is suspended.- codegen_demo: added a
sync_download_with_progressfixture covering sync + optionalStreamSinkend to end. - Version aligned with
dcb_gen_tool1.3.0.
1.2.4 #
- Fix macOS cross-architecture builds: async_simple's uthread static/shared
targets (Darwin assembly selected by
CMAKE_SYSTEM_PROCESSOR, which ignoresCMAKE_OSX_ARCHITECTURES) are now excluded from the default CMake build. The runtime only uses the header-only target, so the unused uthread assembly is no longer compiled — previously building an x86_64 slice on an arm64 host (or vice versa) compiled the wrong.Sfile and failed. - Version aligned with
dcb_gen_tool1.2.4 (no tooling changes).
1.2.3 #
- Fix macOS universal-binary builds:
DcbCMakeBuildernow passes the hooks-providedtargetArchitectureto CMake via-DCMAKE_OSX_ARCHITECTURES(arm64 / x86_64) instead of building the host architecture twice. Flutter's native-assets flow invokes the hook once per architecture and merges the slices with lipo; previously both invocations produced the same host-arch dylib andlipo -createfailed. - Version aligned with
dcb_gen_tool1.2.3 (no tooling changes).
1.2.2 #
- Version aligned with
dcb_gen_tool1.2.2 (codegeninitfile://path handling bugfix; no runtime API changes).
1.2.1 #
- Version aligned with
dcb_gen_tool1.2.1 (codegen bugfix release; no runtime API changes).
1.2.0 #
- Cancellable
async_simple::coro::sleep()onAsioExecutor: theschedule(Func, Duration, Slot*)override now registers aSignalType::Terminatehandler that cancels the underlyingasio::steady_timer, so a sleep bound to a cancellation signal (Lazy::setLazyLocal, orcollectAny<Terminate>/collectAll<Terminate>) throwsSignalExceptionpromptly instead of waiting out the duration. ForeignExecutor: explicitschedule(Func, Duration, Slot*)override with two paths — an optional native event-loop timer, or a deactivation-safe waiter-thread fallback. Pending sleeps never dereference the executor after it is deactivated or destroyed.- New foreign-runtime C API:
dcb_foreign_register_exwith optionaldcb_schedule_after_fn/dcb_cancel_after_fnnative timer callbacks (additive;dcb_foreign_registeris unchanged). - Internal timer failures are logged to stderr (
[dcb] ...) instead of being silently swallowed.
1.1.1 #
- Fix hot-restart safety across Dart/native boundary.
- Encode the session id directly as the
NativeFinalizertoken pointer value, avoiding a cross-modulemalloc/freemismatch on hot restart. - Copy posted wire frames and send them as external typed data with a finalizer, so Dart owns the buffer lifetime.
- Guard
Runtime::start()/Runtime::stop()with a mutex to prevent races. - Catch exceptions in
dcb_session_finalizer, object-handle drop callbacks, and session dispose callbacks so they never propagate across FFI.
- Encode the session id directly as the
1.1.0 #
DcbBuildOptions.compileCommandsPath: configurable destination forcompile_commands.json(relative to package root).AndroidConfig.abi: when omitted, the ABI is auto-derived frominput.config.code.targetArchitecture.WindowsConfig: improved Visual Studio detection and automaticvcvarsall.batenvironment initialization for Ninja builds.- Update package description to reflect ready Native Assets build hooks.
1.0.0 #
- First stable release.
- Dart FFI session layer with sync, async, stream, and DartFn reverse-call support.
- Multi-runtime support: bridge isolated C++ runtimes via
co::oneshot/co::mpscchannels. - Foreign runtime integration (libuv demo) through
ForeignExecutorC API. - Pure C cross-runtime bridge API (
cbridge.h) for non-asio / non-C++ callers. - Native Assets hooks (
hook/link.dart,hook/build.dart) for Android, iOS, Linux, macOS, and Windows. - Vendored Dart API DL headers (no network fetch during build).
- English-only public API comments and documentation.
0.1.0-dev.2 #
- Point
repositoryat monorepo package path (.../tree/main/dart) for pub.dev verification. - Document public codec APIs (dartdoc coverage).
- Declare platforms: android, ios, linux, macos, windows (no web).
- Strip all demo code; base library only exposes protocol primitives and bridge infrastructure.
0.1.0-dev.1 #
- Initial dev publish to reserve the package name on pub.dev.
- Phase 1 hand-written Dart bindings (sync / async / stream / DartFn).
- Native library must be built separately from the monorepo (hooks not wired yet).
- See repository README for full status.