29 Commits

Author SHA1 Message Date
Ivan FB
7e7632a8e9
refactor(codegen): name RET status codes in C++/Rust callbacks
Avoid magic ret-code integers in the generated callback helpers. The C
trampolines already reference NIMFFI_RET_STALE_WARN; mirror that in the other
two backends: define the canonical NIMFFI_RET_* set once in the C++ header
prelude (guarded so a mixed TU keeps a single definition) and emit module-level
NIMFFI_RET_* consts in the Rust crate, then use the named constants for the
stale-warn, ok, and missing-callback checks instead of 3/0/2.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-11 01:07:04 +02:00
Ivan FB
825ae5af06
feat(ffi): RET_STALE_WARN progress callback replacing handler timeout
nim-ffi never times a handler out: a hard-cancel mid-call into the
underlying library (Waku/libp2p) can leave it half-applied. Instead, while
a request is still in flight its result callback receives a non-terminal
RET_STALE_WARN every StaleWarnInterval (5s default, Android's ANR interval;
-d:ffiStaleWarnIntervalMs to override), carrying the elapsed milliseconds as
a decimal string. The request always ends with exactly one terminal
RET_OK/RET_ERR — the dev decides what to do with a slow one, nim-ffi does
not decide for them.

This replaces the never-released per-proc {.ffi: "timeout = <ms>".} override
and the defaultRequestTimeout context field (issue #93), whose hard abort
unblocked the caller early. The stale-warn interval is an internal context
seam (staleWarnInterval), not a per-proc pragma.

Codegen: emit RET_STALE_WARN in the C/C++ headers, and guard every generated
trampoline (C, C++, Rust, and the Nim abi=c reply trampolines) to early-return
on the non-terminal code so the repeated callback can't double-free the
one-shot reply box. Typed wrappers ignore the progress signal for now; it is
delivered at the raw result-callback boundary.

Closes #126.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-11 00:59:26 +02:00
Gabriel Cruz
7ef58f4bf5
feat: shrink the genbindings incantation (#119) 2026-07-10 17:13:06 -03:00
Gabriel Cruz
5eaa799b7d
feat: CBOR-free abi=c C bindings (-d:targetLang=c_abi) (#109) 2026-07-06 13:48:08 -03:00
Gabriel Cruz
7e3fd96e74
feat(codegen): C binding generator (-d:targetLang=c) (#102) 2026-07-01 12:00:47 -03:00
Gabriel Cruz
f1cb110e52
fix: stale echo.hpp (#103) 2026-06-30 11:47:34 -03:00
Ivan FB
5d49ee6b08
feat(ffi): sharded MPSC request ingress (alternative to lock-free #98) (#101)
Co-authored-by: Gabriel Cruz <8129788+gmelodie@users.noreply.github.com>
2026-06-27 19:08:10 +02:00
Gabriel Cruz
3d7b267ef0
chore: bump nim versions to 2.2.6 and stable (#100) 2026-06-26 10:54:21 -03:00
Gabriel Cruz
4bac7a7bc6
test(bench): submit-throughput scaling gate for sendRequestToFFIThread (issue #90) (#97) 2026-06-25 18:02:45 -03:00
Gabriel Cruz
64a332ca8b
feat(ffi): scalar type mappings + seq[byte] byte-string codec (#99) 2026-06-25 17:16:21 -03:00
Gabriel Cruz
a5ccadd62d
feat(ffi): per-interaction ABI-format annotations + c codec (ffiRaw) (#85) 2026-06-23 11:18:03 -03:00
Gabriel Cruz
16dc1b3573
chore(ci): add nph linting (#77) 2026-06-10 16:30:30 -03:00
Gabriel Cruz
54c41a3e62
refactor(ffi): event thread scaffolding + FFIContext lifecycle split (#71) 2026-06-08 11:46:16 -03:00
Ivan FB
f96a5b158a
Remove wildcard event listener; keep per-event dispatch (#70) 2026-06-02 22:22:35 +02:00
Ivan FB
e0bd74232b
Rust event examples (#53)
* rust examples: sync main.rs + tokio main.rs demoing the listener API

Adds two bundled examples to the generated Rust crate:

- examples/main.rs: sync flow using std::sync::mpsc to bridge a typed
  on_echo_fired listener into main + a wildcard add_event_listener
  that uses decode_event_payload::<EchoEvent>(envelope) for the
  matching event id.
- examples/tokio_main.rs: same shape via #[tokio::main] +
  tokio::sync::mpsc.

Bumps generateCargoToml to ship `[dev-dependencies]` with tokio's
`rt-multi-thread` + `macros` features so the bundled examples can use
#[tokio::main] without polluting the library's runtime profile.

Run with `cargo run --example main` (set DYLD_LIBRARY_PATH=<repo> on
macOS until build.rs emits an rpath).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* simplify examples

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 13:34:56 -03:00
Ivan FB
c43563f82f
rust codegen: per-event typed add_on_<x>_listener + wildcard add_event_listener (#52) 2026-05-29 20:40:28 +02:00
Gabriel Cruz
7ccf34591d
chore: avoid throwing exceptions in C++ bindings (#46) 2026-05-29 12:35:49 -03:00
Ivan FB
e394166c46
Cpp typed event listeners (#51) 2026-05-28 22:40:33 +02:00
Ivan FB
3f19411684
Event listener abi (#50) 2026-05-28 16:00:28 +02:00
Gabriel Cruz
436c0d760b
test(cpp-e2e): add multi-context, cross-library, pipeline, stress tests (#30) (#42) 2026-05-26 09:18:12 -03:00
Ivan FB
6a7e4616fd
Adjust events to cbor (#39) 2026-05-25 15:51:56 +02:00
Gabriel Cruz
31d0ebfa51
chore(ci): extend cpp-e2e to OS matrix (#38) 2026-05-22 11:43:37 -03:00
Ivan FB
c7cf46bdea
avoid move ctor and assing operator in cpp generated code (#36) 2026-05-21 16:38:13 +02:00
Ivan FB
5e6e58e7d1
Increase version to v0.2.0 (#37) 2026-05-21 16:33:38 +02:00
Ivan FB
584e818ac9
Add basic cpp e2e tests (#27) 2026-05-19 12:43:34 +02:00
Ivan FB
e12745e85c
Add cddl generator (#24) 2026-05-18 20:00:57 +02:00
Ivan FB
ac303a707e
Start using CBOR (#23)
Co-authored-by: NagyZoltanPeter <113987313+NagyZoltanPeter@users.noreply.github.com>
Co-authored-by: Gabriel Cruz <8129788+gmelodie@users.noreply.github.com>
2026-05-16 01:08:42 +02:00
Ivan FB
6d31fa30bd
use fixed array of ctx to avoid consuming all fds (#14) 2026-05-13 00:02:23 +02:00
Ivan FB
a52c4facd9
Simplified FFI authoring with auto-generated C++ and Rust bindings (#15) 2026-05-11 23:28:17 +02:00