Ir al contenido
Español

TcpServerActor

Esta página aún no está disponible en tu idioma.

Defined in: src/io/broker/TcpServerActor.ts:103

TCP listener actor — the server-side counterpart to TcpSocketActor (#158).

Built on runtime/tcp’s getTcpBackend rather than node:net, so the Bun / Node / Deno differences (and TLS, including mTLS) come from the adapter the cluster transport already uses, not from a second copy.

Why a BrokerActor and not a separate IO manager. A listener needs exactly what the base class already owns: a lifecycle with an explicit state, a backoff policy for a bind that fails (a port in TIME_WAIT is the ordinary case), BrokerConnected / BrokerDisconnected events, the three-layer options merge, and validation. UdpSocketActor already maps bound onto connected for the same reason; a parallel manager-actor + registration handshake would re-implement all of it to gain nothing this API needs.

One actor, not one actor per connection. Connections are addressed by an opaque TcpConnectionId instead of getting an actor each, because an actor’s restart semantics do not apply to a socket — a restarted connection actor cannot resurrect the peer’s TCP connection, so the supervision that per-connection actors would buy is illusory. The target is free to spawn a child per connectionOpened when it wants per-connection state; nothing here forces the allocation.

Inbound goes to target as TcpServerMessage; outbound is the ordinary broker path, so ordering follows the mailbox.

new TcpServerActor(options?): TcpServerActor

Defined in: src/io/broker/TcpServerActor.ts:116

TcpServerOptions = {}

TcpServerActor

BrokerActor<TcpServerOptionsType, TcpServerCommand, TcpServerCommand>.constructor

get boundPort(): number

Defined in: src/io/broker/TcpServerActor.ts:162

OS-assigned port after bind — the value to read back when bindPort: 0.

number


get connectionCount(): number

Defined in: src/io/broker/TcpServerActor.ts:165

Connections currently accepted and registered.

number

displayName(): string

Defined in: src/Actor.ts:192

Human-readable name for this actor in log lines and in the DevTools actor tree (#891). Defaults to the full path — which is already the log source, so an actor that doesn’t override this logs exactly as it did before.

override displayName(): string { return `User(${this.entityId})`; }

Purely cosmetic. The path stays the identity everywhere that routes, correlates or aggregates — metric labels, tracing attributes, dead letters, ActorRef.toString(), every wire identifier — so a display name is free to be ambiguous, unstable, or shared between actors.

Resolved on every record, not captured once. Two consequences: keep it cheap and side-effect free, and expect it to be called before preStart (hence the optional chain — the context is attached after construction). In exchange a name may be derived from state, and it updates when that state does. Throwing, or returning anything but a non-empty string, falls back to the path and warns once: a naming hook must not be able to take a log line down with it.

ActorOptions.withDisplayName(...) outranks this, for the same reason withSupervisorStrategy(...) outranks supervisorStrategy — the spawn site is the more specific statement. It has to: every Behaviors actor is a TypedActor that inherits this default, so a method that won would silently swallow the spawn-site value for exactly the actors that have no subclass to override. For a name that only becomes known at runtime, this.context.setDisplayName(...) outranks both.

string

BrokerActor.displayName


onReceive(command): void

Defined in: src/io/broker/TcpServerActor.ts:204

Main message handler. Receives each envelope dequeued from the mailbox. A thrown error (sync or async) is caught by the supervisor.

TcpServerCommand

void

BrokerActor.onReceive


postRestart(_reason): void | Promise<void>

Defined in: src/Actor.ts:152

Called on the fresh instance after a restart. Default: call preStart().

Error

void | Promise<void>

BrokerActor.postRestart


postStop(): Promise<void>

Defined in: src/io/broker/BrokerActor.ts:486

Called after the actor has been terminated. Children are already stopped.

Promise<void>

BrokerActor.postStop


preRestart(_reason, _message?): void | Promise<void>

Defined in: src/Actor.ts:119

Called before a restart, on the instance about to be thrown away. The default calls postStop() and nothing else.

Override to release what the instance holds outside itself — a file handle, an open socket, a broker connection — or to do something other than drop the message that failed.

Stopping this actor’s children is not done here: the framework tears them down after this hook returns and waits for them before building the replacement, because postRestart re-runs preStart and a named child needs its name back. To keep the children instead, see Actor.stopChildrenOnRestart.

Error

TcpServerCommand

void | Promise<void>

BrokerActor.preRestart


preStart(): Promise<void>

Defined in: src/io/broker/BrokerActor.ts:477

Called after construction and before the first message is processed.

Promise<void>

BrokerActor.preStart


stopChildrenOnRestart(): boolean

Defined in: src/Actor.ts:149

Whether a restart tears this actor’s children down before rebuilding it. Default: true.

A restart replaces the Actor instance while the cell — and therefore the child map — survives. Keeping the children was the old behaviour and it made an ordinary pattern impossible: postRestart re-runs preStart, so an actor that spawns a named child there hit Child name … is not unique on its first restart and never recovered (#634).

Override to false when the children are expensive to rebuild, hold state the parent cannot restore, or are supervised independently — a connection pool, say. They then outlive the restart exactly as before, and it is on you to make preStart idempotent — by adopting the survivor from the cell, this.child = this.context.child('name').toNullable() ?? this.context.spawn(Child, 'name'), or with context.spawnAnonymous. An instance field cannot do it: preStart runs on a fresh instance after every restart, so this.child ??= … is always unset and re-spawns into the name the surviving child still holds, which fails the spawn and restarts the actor again.

This is a separate hook rather than a preRestart override because the teardown has to be awaited: the new instance cannot be built until the old children are actually gone, and preRestart has no way to tell the cell that it started something worth waiting for.

boolean

BrokerActor.stopChildrenOnRestart


supervisorStrategy(): SupervisorStrategy

Defined in: src/Actor.ts:160

Supervisor strategy for this actor’s children. Defaults to restart, up to 10 times per minute, then stop.

SupervisorStrategy

BrokerActor.supervisorStrategy