Skip to content

TCP Send (tcp-out)

Writes msg.payload to a TCP peer. The mode selector picks where the destination comes from: a msg.session handle attached upstream by tcp-in server, every active session of a sibling tcp-in (broadcast), or a fresh dial to a remote.

Inputs Outputs
1 0

Modes

Mode Destination source
reply msg.session (set by an upstream tcp-in server).
server-broadcast All currently-connected sessions whose owner matches the configured targetTcpIn.
client Dialed to host:port (or msg.host / msg.port).

Configuration

Common

Field Default Description
mode reply One of reply, server-broadcast, client.
appendDelimiter — Bytes appended after msg.payload (JS-style escapes). Useful for \n framing.
closeAfterSend false Half-close the connection after writing.
writeTimeout 10s Per-write deadline.

server-broadcast mode

Field Description
targetTcpIn Node ID of the tcp-in server whose sessions receive the broadcast.

Broadcast iterates sessions serially with a per-session writeTimeout. A slow peer cannot block delivery to others — its write fails after the deadline and the loop continues. Per-target errors are logged but do not stop the broadcast.

client mode

Field Default Description
host — Destination host. msg.host overrides.
port — Destination port. msg.port overrides.
keepConnection true Keep one connection across messages (recommended).
dialTimeout 10s Connect timeout.
outboundQueueSize 64 Backpressure buffer when the persistent conn is reconnecting. Overflow → catchable error.
tls — See TLS configuration.

With keepConnection=true a single worker holds the connection open and drains messages from a bounded outbound channel. On disconnect it reconnects with exponential backoff. Messages enqueued during the down phase wait in the channel; overflow raises a catchable error rather than silently blocking — loud failure beats silent stall.

Incoming message

Field Required Description
payload yes* Body to send. string → UTF-8 bytes; []byte / []int → raw bytes; nil → empty write (only useful with appendDelimiter).
session reply The opaque handle from an upstream tcp-in server.
host, port client Override the configured destination.
closeAfterSend optional Per-message override.

(* payload may be empty when paired with appendDelimiter.)

Errors

All write failures are catchable — pair the node with a Catch node to react:

Cause Error text
Missing msg.session (reply) tcp-out … : no session handle on msg.session
Session already closed (reply) tcp-out … : flow: tcp session closed
Dial failure (client) tcp-out … : dial host:port: …
Write timeout / broken pipe tcp-out … : write: …
Persistent client overflow tcp-out … : outbound queue full

Examples

Echo-on-receive with line framing.

[tcp-in  server :7000 delim=\n] → [Function: uppercase] → [tcp-out reply append=\n]

Push notifications to every connected client.

[Inject 10s] → [Change set payload="heartbeat"] → [tcp-out broadcast → tcp-in :7000]

Persistent client to a downstream service.

[mqtt-in topic=ingest] → [Change …] → [tcp-out client device:9100 keepConnection=true]

See also