Skip to content

RpcMiddleware

Middleware services for the unstable RPC runtime.

A middleware service wraps server handler execution and can also install a client-side wrapper for generated clients. Its metadata records the services provided to downstream handlers, the services required by the middleware implementation, the schema for server-visible failures, the client-only error type, and whether generated clients must require the matching client layer.

20 exports Added in v4.0.0 Source

Constructors

Service

Added in v4.0.0 Source

Creates a typed RPC middleware service class, with optional service requirements, provided services, error schema, and client-side requirement metadata.

Signature

declare function Service<
  Self,
  Config extends {
    clientError?: any;
    provides?: any;
    requires?: any;
  } = {
    clientError: never;
    provides: never;
    requires: never;
  },
>(): <Name extends string, Error extends Top = Never, RequiredForClient extends boolean = false>(
  id: Name,
  options?: {
    readonly error?: Error;
    readonly requiredForClient?: RequiredForClient;
  },
) => ServiceClass<
  Self,
  Name,
  "provides" extends keyof Config ? Config["provides"] : never,
  Error,
  "clientError" extends keyof Config ? Config["clientError"] : never,
  "requires" extends keyof Config ? Config["requires"] : never,
  RequiredForClient
>;

Layers

layerClient

Added in v4.0.0 Source

Provides the client-side implementation for an RPC middleware service, capturing the layer's environment and merging it into each middleware invocation.

Signature

declare function layerClient<Id extends AnyId, S, R, EX = never, RX = never>(
  tag: Key<Id, S>,
  service:
    | RpcMiddlewareClient<
        Id["~effect/rpc/RpcMiddleware"]["error"]["Type"],
        Id["~effect/rpc/RpcMiddleware"]["clientError"],
        R
      >
    | Effect<
        RpcMiddlewareClient<
          Id["~effect/rpc/RpcMiddleware"]["error"]["Type"],
          Id["~effect/rpc/RpcMiddleware"]["clientError"],
          R
        >,
        EX,
        RX
      >,
): Layer<ForClient<Id>, EX, R | Exclude<RX, Scope>>;

Models

Any interface

Added in v4.0.0 Source

An erased server-side RPC middleware function, useful when the concrete provided services, errors, and requirements are not needed.

Signature

interface Any {
  (
    effect: Effect<SuccessValue, any, any>,
    options: {
      readonly client: ServerClient;
      readonly headers: Headers;
      readonly payload: unknown;
      readonly requestId: RequestId;
      readonly rpc: AnyWithProps;
    },
  ): Effect<SuccessValue, any, any>;
}

AnyService interface

Added in v4.0.0 Source

An erased RPC middleware context key carrying middleware metadata.

Signature

interface AnyService extends Key<any, any> {
  readonly "~ClientError": any;
  readonly "~effect/rpc/RpcMiddleware": "~effect/rpc/RpcMiddleware";
  readonly error: Top;
  readonly requiredForClient: boolean;
}

AnyServiceWithProps interface

Added in v4.0.0 Source

An erased RPC middleware context key whose service value is a server-side middleware function.

Signature

interface AnyServiceWithProps extends Key<any, RpcMiddleware<any, any, any>> {
  readonly "~ClientError": any;
  readonly "~effect/rpc/RpcMiddleware": "~effect/rpc/RpcMiddleware";
  readonly error: Top;
  readonly requiredForClient: boolean;
}

ForClient interface

Added in v4.0.0 Source

Marker service requirement indicating that a middleware has a client-side implementation available for an RPC client.

Signature

interface ForClient<Id> {
  readonly _: typeof _;
  readonly id: Id;
}

RpcMiddleware interface

Added in v4.0.0 Source

The server-side RPC middleware function shape, wrapping a handler effect with access to request metadata and translating provided services into required services.

Signature

interface RpcMiddleware<Provides, E, Requires> {
  (
    effect: Effect<SuccessValue, unhandled | E, Provides>,
    options: {
      readonly client: ServerClient;
      readonly headers: Headers;
      readonly payload: unknown;
      readonly requestId: RequestId;
      readonly rpc: AnyWithProps;
    },
  ): Effect<SuccessValue, unhandled | E, Scope | Requires>;
}

RpcMiddlewareClient interface

Added in v4.0.0 Source

The client-side RPC middleware function shape, allowing outgoing requests to be inspected or modified before calling next.

Signature

interface RpcMiddlewareClient<E, CE, R> {
  (options: {
    readonly next: (request: Request<Any>) => Effect<SuccessValue, unhandled | E>;
    readonly request: Request<Any>;
    readonly rpc: AnyWithProps;
  }): Effect<SuccessValue, unhandled | E | CE, R>;
}

SuccessValue interface

Added in v4.0.0 Source

Marker success type used by RPC middleware to represent successful completion without exposing the handler's concrete success value.

Signature

interface SuccessValue {
  readonly _: typeof _;
}

Services

ServiceClass interface

Added in v4.0.0 Source

The Context.Service class shape created for an RPC middleware, including its error schema, service metadata, and client-side requirement marker.

Signature

interface ServiceClass<
  Self,
  Name extends string,
  Provides,
  E extends Schema.Constraint,
  ClientError,
  Requires,
  RequiredForClient extends boolean,
> extends Service<Self, RpcMiddleware<Provides, E["Type"], Requires>> {
  constructor(_: never);
  readonly "~ClientError": ClientError;
  readonly "~effect/rpc/RpcMiddleware": "~effect/rpc/RpcMiddleware";
  readonly error: E;
  readonly requiredForClient: RequiredForClient;
}

Type IDs

TypeId

Added in v4.0.0 Source

The runtime type id used to attach and inspect RPC middleware metadata.

Signature

declare const TypeId: "~effect/rpc/RpcMiddleware";

TypeId type

Added in v4.0.0 Source

The literal type id used to identify RPC middleware service classes.

Signature

type TypeId = "~effect/rpc/RpcMiddleware";

Utility Types

AnyId interface

Added in v4.0.0 Source

A type-level carrier for RPC middleware metadata, including provided services, required services, error schema, and client error type.

Signature

interface AnyId {
  readonly "~effect/rpc/RpcMiddleware": {
    readonly clientError: any;
    readonly error: Top;
    readonly provides: any;
    readonly requires: any;
  };
}

ApplyServices type

Added in v4.0.0 Source

Applies a middleware's service transformation to an RPC environment by removing services the middleware provides and adding services it requires.

Signature

type ApplyServices<A, R> = Exclude<R, Provides<A>> | Requires<A>;

Error type

Added in v4.0.0 Source

Extracts the decoded error type produced by an RPC middleware.

Signature

type Error<A> = ErrorSchema<A>["Type"];

ErrorSchema type

Added in v4.0.0 Source

Extracts the error schema associated with an RPC middleware.

Signature

type ErrorSchema<A> = A extends {
  readonly "~effect/rpc/RpcMiddleware": {
    readonly error: infer E;
  };
}
  ? E extends Schema.Constraint
    ? E
    : never
  : never;

ErrorServicesDecode type

Added in v4.0.0 Source

Extracts the decoding services required by a middleware's error schema.

Signature

type ErrorServicesDecode<A> = ErrorSchema<A>["DecodingServices"];

ErrorServicesEncode type

Added in v4.0.0 Source

Extracts the encoding services required by a middleware's error schema.

Signature

type ErrorServicesEncode<A> = ErrorSchema<A>["EncodingServices"];

Provides type

Added in v4.0.0 Source

Extracts the services provided by an RPC middleware.

Signature

type Provides<A> = A extends {
  readonly "~effect/rpc/RpcMiddleware": {
    readonly provides: infer P;
  };
}
  ? P
  : never;

Requires type

Added in v4.0.0 Source

Extracts the services required by an RPC middleware.

Signature

type Requires<A> = A extends {
  readonly "~effect/rpc/RpcMiddleware": {
    readonly requires: infer R;
  };
}
  ? R
  : never;