mirror of
https://github.com/logos-messaging/logos-messaging-go-bindings.git
synced 2026-08-26 18:31:13 +00:00
fix/kernel-wire-decoding
2
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
e42d217c59 |
refactor: kernel.Node owns the node, MessagingClient exposes it (#122)
* refactor: make kernel.Node the single owner of the node context The Kernel API and the Messaging API each built their own node and kept the FFI handle private, so a MessagingClient had no way to reach store queries, peers or metrics. The C library has one context serving both tiers, so this was only a Go ownership problem. kernel.Node now owns that context, and the kernel protocols hang off it as facades: Relay(), Store(), Peers(), Discovery(), plus Messaging() for the stable tier. MessagingClient drives a Node and hands it over with Node(), mirroring the Nim MessagingClient's public waku field. * refactor: address review on the Node facades Move the Messaging API back out of pkg/kernel: ffi.Handle becomes a defined type in the internal package, so kernel can hand the context to pkg/messaging through kernel.Handle without the kernel layer knowing the tier exists, and without the type being nameable outside this module. Split Discovery into DiscV5, PeerExchange and DNSDiscovery, group the node's identity and health under Debug(), and give every facade a pointer receiver. Drop the node name, the per-operation logging that duplicates what the library already writes, and GetFreePortIfNeeded — port 0 already means "let the OS pick". Heavy kernel tests now mark themselves with requiresNode and skip under -short, so the gate runs `go test -short ./...` instead of naming tests in a regexp. * refactor: keep the Messaging API where it was Restore messaging_client.go to its shape before this PR: Subscribe, Unsubscribe and Send go back on MessagingClient, and the package imports internal/ffi for the handle rather than reaching the calls through the kernel. The only change left is what owning a kernel.Node requires — the node holds the lifecycle and the listeners, and Node() exposes it. * fix: keep allocating test ports, and move that out of the library Removing GetFreePortIfNeeded also removed the allocation StartWakuNode did, and the library does not treat a zero DiscV5 UDP port as "pick one": every node tried the same default and all but the first failed to bind. StartWakuNode is test scaffolding, so it moves to the test helpers along with the port allocation. Neither is part of the package surface now. * chore: go mod tidy * refactor: let the library pick the ports, and address review TcpPort and Discv5UdpPort were `omitempty`, so a zero port was dropped from the JSON entirely and the library applied its own default of 9000 — every node bound the same port and all but the first failed. With the zero emitted, the library's auto-port retry picks a free one per node, which is what "port 0 means port 0" needs to work. The test-side port allocation is gone with it. Also: Handle moves to its own file with a Valid method and the reasoning for not aliasing unsafe.Pointer, logInfo is back alongside the other levels, and the single-field facade structs are spelled out. |
||
|
|
7b138bf71f |
feat: Messaging API (MessagingClient) (#120)
* feat(messaging): object-oriented Go mirror of the Nim MessagingClient
Adds pkg/messaging: a high-level, idiomatic Go binding for the Messaging
API, mirroring logos-delivery's Nim MessagingClient. A MessagingClient owns
a node and carries the messaging surface as methods on it — New / Start /
Stop / Close, Subscribe / Unsubscribe, Send(ctx, Envelope) (RequestID,
error) — over internal/ffi rather than exposing the raw FFI.
Events arrive on a single Events() <-chan Event with a sealed Event
interface: MessageReceivedEvent, MessageSentEvent, MessagePropagatedEvent,
MessageErrorEvent and ConnectionStatusEvent. Delivery never blocks the
library's event thread; an event is dropped when a consumer falls behind.
Config marshals to the layered configuration JSON (mode / preset /
messagingOverrides / channelsOverrides), with every field omitempty so it
can never be mistaken for the legacy flat blob.
Migrating internal/ffi to the current C ABI comes with it, because the
generated surface has moved on since the bridge was written and no longer
compiles: nim-ffi now generates the header from the {.ffi.} annotations,
argument-taking calls pass a per-call <Name>Req struct and a typed
<Name>ReplyFn, no-argument calls take a raw scalar callback, destroy is
synchronous, and the single set_event_callback has been replaced by a
per-event listener registry. The bridge now also copies every callback
string while it is still borrowed, and ignores the non-terminal
STALE_WARN progress code instead of settling the call on it.
pkg/kernel follows the same listener change, registering the three kernel
events it already consumed.
Verified against a liblogosdelivery built from logos-delivery master:
build / vet / golangci-lint / go mod tidy clean, unit tests green, and the
tagged integration test does a full create-start-subscribe-send round trip
on logos.dev, observing the message back and its propagation confirmation.
Closes #119.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CnzdnSMtHM5aLHLtDGBGR9
* review: address feedback on the MessagingClient API
- Send takes contentTopic / payload / ephemeral directly instead of an
Envelope struct, which drops the Envelope type; ContentTopic and RequestID
move to types.go.
- messagingEvents becomes a function returning the slice, so the set cannot
be mutated by accident.
- Document what seals the Event interface and what that buys callers.
- Document why the received payload is decoded from a JSON integer array:
base64 is only used on the send path and by the channel events, not by the
messaging events.
* ci: stop golangci-lint's config verify from failing on a network timeout
golangci-lint-action runs `golangci-lint config verify` before linting, which
fetches the v2.4 JSON schema from golangci-lint.run on every run. That request
timed out on the runner and failed the gate with no lint finding behind it. An
invalid config still fails the lint run itself, so the pre-check only costs a
network dependency.
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|