/** * Handles communication between Effect Cluster runners. * * `Runners` sits between sharding decisions and runner execution. It can ping a * runner, send requests or control envelopes, notify a runner that persisted * work is available, and record that a runner address is unavailable. This * module defines the runner communication service, its RPC protocol, no-op and * RPC-backed implementations, local persistence support, reply recovery, and * the protocol service used by transport-specific runner layers. * * @stability unstable * @since 4.0.0 */ import * as Context from "../Context.ts"; import * as Effect from "../Effect.ts"; import * as Layer from "../Layer.ts"; import * as Option from "../Option.ts"; import * as Rpc from "../rpc/Rpc.ts"; import * as RpcClient_ from "../rpc/RpcClient.ts"; import type { RpcClientError } from "../rpc/RpcClientError.ts"; import * as RpcGroup from "../rpc/RpcGroup.ts"; import * as RpcSchema from "../rpc/RpcSchema.ts"; import type * as RpcSerialization from "../rpc/RpcSerialization.ts"; import * as Schema from "../Schema.ts"; import type { Scope } from "../Scope.ts"; import type { PersistenceError } from "./ClusterError.ts"; import { AlreadyProcessingMessage, EntityNotAssignedToRunner, MailboxFull, RunnerUnavailable } from "./ClusterError.ts"; import * as Envelope from "./Envelope.ts"; import * as Message from "./Message.ts"; import * as MessageStorage from "./MessageStorage.ts"; import * as Reply from "./Reply.ts"; import type { RunnerAddress } from "./RunnerAddress.ts"; import { ShardingConfig } from "./ShardingConfig.ts"; import * as Snowflake from "./Snowflake.ts"; declare const Runners_base: Context.ServiceClass Effect.Effect; /** * Send a message locally. * * This ensures that the message hits storage before being sent to the local * entity. */ readonly sendLocal: (options: { readonly message: Message.Outgoing; readonly send: (message: Message.IncomingLocal) => Effect.Effect; readonly simulateRemoteSerialization: boolean; }) => Effect.Effect; /** * Send a message to a Runner. */ readonly send: (options: { readonly address: RunnerAddress; readonly message: Message.Outgoing; }) => Effect.Effect; /** * Notify a Runner that a message is available. Persisted messages recover * replies from storage, while volatile messages complete after delivery. */ readonly notify: (options: { readonly address: Option.Option; readonly message: Message.Outgoing; readonly discard: boolean; }) => Effect.Effect; /** * Notify the current Runner that a message is available, then read replies from * storage. * * This ensures that the message hits storage before being sent to the local * entity. */ readonly notifyLocal: (options: { readonly message: Message.Outgoing; readonly notify: (options: Message.IncomingLocal) => Effect.Effect; readonly discard: boolean; readonly storageOnly?: boolean | undefined; }) => Effect.Effect; /** * Mark a Runner as unavailable. */ readonly onRunnerUnavailable: (address: RunnerAddress) => Effect.Effect; }>; /** * Service for communicating with cluster runners, including pinging runners, * sending and notifying messages, coordinating persisted replies, and marking * runners unavailable. * * @stability unstable * @category services * @since 4.0.0 */ export declare class Runners extends Runners_base { } /** * Builds the `Runners` service from remote runner callbacks and adds local * message persistence, duplicate request handling, optional local serialization * simulation, and polling for persisted replies. * * **When to use** * * Use when you need a custom `Runners` service around remote `ping`, `send`, * `notify`, and `onRunnerUnavailable` callbacks, with standard local * persistence and reply recovery behavior. * * **Details** * * `make` uses the supplied remote callbacks for runner communication and * derives `sendLocal` and `notifyLocal`. Local sends can optionally simulate * remote serialization with the supplied transport codec, persisted notifications are saved through * `MessageStorage`, duplicate requests are resumed from stored replies when * possible, and pending replies are polled according to * `ShardingConfig.entityReplyPollInterval`. * * @see {@link makeRpc} for the RPC-backed implementation built on top of this constructor * @see {@link makeNoop} for a no-op implementation when remote runner communication is not needed * * @stability unstable * @category constructors * @since 4.0.0 */ export declare const make: (options: Omit & { readonly codecFor: RpcSerialization.CodecFor; }) => Effect.Effect; /** * Creates a no-op `Runners` service that rejects sends with * `EntityNotAssignedToRunner` and ignores notifications, pings, and unavailable * runner reports. * * @stability unstable * @category constructors * @since 4.0.0 */ export declare const makeNoop: Effect.Effect; /** * Layer that provides the no-op `Runners` service, using the default snowflake * generator. * * @stability unstable * @category layers * @since 4.0.0 */ export declare const layerNoop: Layer.Layer; declare const Rpcs_base: RpcGroup.RpcGroup, Schema.Codec, Schema.Union<[typeof EntityNotAssignedToRunner, typeof MailboxFull, typeof AlreadyProcessingMessage]>, never, never> | Rpc.Rpc<"Envelope", Schema.Struct<{ envelope: Schema.Union; persisted: Schema.Boolean; }>, Schema.Void, Schema.Union<[typeof EntityNotAssignedToRunner, typeof MailboxFull, typeof AlreadyProcessingMessage]>, never, never> | Rpc.Rpc<"Notify", Schema.Struct<{ envelope: Schema.Union; persisted: Schema.Boolean; }>, Schema.Void, Schema.Union<[typeof EntityNotAssignedToRunner, typeof MailboxFull, typeof AlreadyProcessingMessage]>, never, never> | Rpc.Rpc<"Ping", Schema.Void, Schema.Void, Schema.Never, never, never> | Rpc.Rpc<"Stream", Schema.Struct<{ request: typeof Envelope.PartialRequest; persisted: Schema.Boolean; }>, RpcSchema.Stream, Schema.Union<[typeof EntityNotAssignedToRunner, typeof MailboxFull, typeof AlreadyProcessingMessage]>>, Schema.Never, never, never>>; /** * RPC group used for runner-to-runner communication, including ping, notify, * effect, stream, and envelope messages. * * @stability unstable * @category models * @since 4.0.0 */ export declare class Rpcs extends Rpcs_base { } /** * Client interface generated from the runner RPC group. * * @stability unstable * @category models * @since 4.0.0 */ export interface RpcClient extends RpcClient_.FromGroup { } /** * Builds a runner RPC client from the current `RpcClient.Protocol`, using the * `Runners` span prefix with tracing disabled. * * @stability unstable * @category constructors * @since 4.0.0 */ export declare const makeRpcClient: Effect.Effect; /** * Builds a `Runners` service backed by RPC clients, caching a client per runner * address and dispatching ping, notify, effect, stream, and envelope messages over * the runner protocol. * * @stability unstable * @category constructors * @since 4.0.0 */ export declare const makeRpc: Effect.Effect; /** * Layer that provides an RPC-backed `Runners` service using `RpcClientProtocol`, * message storage, sharding configuration, and the default snowflake generator. * * @stability unstable * @category layers * @since 4.0.0 */ export declare const layerRpc: Layer.Layer; declare const RpcClientProtocol_base: Context.ServiceClass Effect.Effect; readonly codecFor: RpcSerialization.CodecFor; }>; /** * Service that creates RPC client protocols for runner addresses and exposes * the codec shared by those protocols. * * @stability unstable * @category services * @since 4.0.0 */ export declare class RpcClientProtocol extends RpcClientProtocol_base { } export {}; //# sourceMappingURL=Runners.d.ts.map