Skip to main content
Docs: ApiGear Core

ApiGear NATS Subject Mapping

This is the wire specification for running ObjectAPI interfaces over NATS. It defines how an interface's members map to NATS subjects and payloads. The mapping is transport-level and language-independent — a service generated by any template interoperates with a client generated by any other.

Subject structure​

NATS subjects use . as the separator. They are built from the module name, interface name, a verb, and the member name:

{moduleName}.{interfaceName}.{verb}.{memberName}
VerbMemberDirectionPurpose
rpcoperationclient → serviceInvoke an operation (request/reply)
sigsignalservice → clientSignal broadcast
setpropertyclient → serviceProperty change request
proppropertyservice → clientProperty value notification

The property verbs match the MQTT mapping: set carries a change request to the service, and prop carries the value notification back to clients.

Operations (request / reply)​

Operations use NATS's native request/reply. The client publishes a request; the service subscribes and replies on the request's reply subject:

Subject: {moduleName}.{interfaceName}.rpc.{functionName}
Content: JSON array of the operation arguments (string-encoded)

Internal (non-API) operations​

Operations not declared in the API use the rpc verb with an underscore prefix on the function name:

{moduleName}.{interfaceName}.rpc._{functionName}

Signals​

The service publishes; clients subscribe:

Subject: {moduleName}.{interfaceName}.sig.{signalName}
Content: JSON array of the signal arguments (string-encoded)

Properties​

Change request — the client publishes a desired value; the service subscribes:

Subject: {moduleName}.{interfaceName}.set.{propertyName}
Content: JSON-encoded property value (string)

Value notification — the service publishes the current value; clients subscribe:

Subject: {moduleName}.{interfaceName}.prop.{propertyName}
Content: JSON-encoded property value (string)

Connectivity messaging​

NATS has no broker-side retained state, so ApiGear adds explicit messages for service discovery and initial state synchronisation:

MessageSubjectContentDirection
Service available{moduleName}.{interfaceName}.service.availableemptyservice → client
Init request{moduleName}.{interfaceName}.initclientIdclient → service
Init response{moduleName}.{interfaceName}.init.resp.{clientId}initial state (JSON object)service → client

A client subscribes to service.available, then sends an init request carrying its clientId; the service replies on init.resp.{clientId} with the current property values so the client starts in sync.

Payloads​

Payloads are string-encoded JSON (nlohmann::json). Operation and signal arguments are JSON arrays; property values and init responses are JSON elements/objects.

Implemented by​

Related: ApiGear over MQTT · ObjectLink · Protocol Mappings