Skip to content

feat(ffi): use nim-ffi master (v0.2.0) — {.ffi.} macros + CBOR#75

Draft
Ivansete-status wants to merge 2 commits into
masterfrom
use-latest-nim-ffi
Draft

feat(ffi): use nim-ffi master (v0.2.0) — {.ffi.} macros + CBOR#75
Ivansete-status wants to merge 2 commits into
masterfrom
use-latest-nim-ffi

Conversation

@Ivansete-status

Copy link
Copy Markdown
Collaborator

Moves libsds onto nim-ffi master (v0.2.0) using the high-level {.ffi.} macros.

Stacked on use-ffi-macros, so this PR contains two commits:

  1. refactor(ffi): switch libsds from registerReqFFI + hand-written exports to declareLibrary/{.ffiCtor.}/{.ffi.}/{.ffiDtor.}.
  2. feat(ffi): port that to nim-ffi 0.2.0 (the breaking redesign).

If use-ffi-macros (#?) is merged first, rebase will drop commit 1.

What changes (vs the v0.1.4 / registerReqFFI mainline)

  • Macro-based API. C entry points are generated by {.ffi.} macros; exports are snake_case (sds_create, sds_wrap_outgoing_message, …). See library/libsds.h.
  • Events → per-context multi-listener registry. sds_add_event_listener(ctx, eventName, cb, ud) / sds_remove_event_listener(ctx, id), fired from typed {.ffiEvent.} emitters. Wire names: message_ready, message_sent, missing_dependencies, periodic_sync, repair_ready.
  • Wire format → CBOR (0.2.0). Requests/responses/events are CBOR; events use an envelope { eventType, payload }.
  • Retrieval-hint provider: a C function pointer (not CBOR-encodable) is passed as a uint64 address via a {.ffi.} method that stores it in a worker-thread threadvar.
  • Deps: pin nim-ffi to master HEAD f96a5b15 by commit; add new transitive dep cbor_serialization; no Nim pin (stays 2.2.4). nimble.lock + nix/deps.nix updated.

Notes

  • nimble lock's #-prefixed special version breaks nimble setup -l (unquoted # truncates the git path), so the lock version is kept a clean 0.2.0 and only vcsRevision carries the commit. Re-running nimble lock re-introduces the # — re-clean that field if you do.
  • Breaking ABI: sds-go-bindings must be updated to the snake_case + CBOR + event-listener model.

Verification

  • nimble libsdsDynamicMac builds clean on Nim 2.2.4 against nim-ffi master.
  • nimble test: 106/106 pass.

🤖 Generated with Claude Code

Ivansete-status and others added 2 commits June 3, 2026 12:19
Switch the C wrapper from the lower-level registerReqFFI + hand-written
exports to nim-ffi's declareLibrary/{.ffiCtor.}/{.ffi.}/{.ffiDtor.}
macros. This removes the per-op boilerplate (request structs, shared-mem
copy helpers, dispatch template) in favour of the framework's JSON
marshalling, and lets participantId be threaded in via config.

Consequences (intentional): C exports are now snake_case and parameters
travel as JSON, so the ABI changes and sds-go-bindings must be updated to
match. Two cases can't ride the JSON path: the retrieval-hint provider is
a C function pointer (kept hand-written, dispatched to set a worker-thread
threadvar) and the unwrap response has nested objects the framework's
serializer can't emit (returned as a hand-built JSON string).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Port the {.ffi.} wrapper to nim-ffi 0.2.0 (master). 0.2.0 is a breaking
redesign over 0.1.4: events move to a per-context multi-listener registry
(sds_add_event_listener / sds_remove_event_listener) fired via {.ffiEvent.}
emitters, and request/response/event marshalling switches from JSON to CBOR.

- libsds.nim: typed {.ffiEvent.} payloads replace the JSON event modules;
  CBOR handles nesting, so unwrap returns a typed response again. The
  retrieval-hint provider (a C function pointer, not CBOR-encodable) passes
  its address as a uint64 via a {.ffi.} method that stores it in a
  worker-thread threadvar.
- pin nim-ffi to master HEAD by commit. The lock version is kept a clean
  semver ("0.2.0") on purpose: nimble's `#`-prefixed special version in the
  lock breaks `nimble setup -l` (an unquoted `#` truncates the git path),
  so only vcsRevision carries the commit.
- add the new transitive dep cbor_serialization to the lock and nix/deps.nix.
- regenerate libsds.h for the CBOR/registry ABI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant