Saltar al contenido
Meeko
Escribe para buscar en las guías y en la referencia de la API. Ábrela desde cualquier página con / o Ctrl K; muévete con las flechas y entra con Intro.
Empezar

Contenidos

En esta página

RpcDefinition

interfaz

Contrato de un procedimiento de server/rpc/: schemas de entrada y salida, guardas y handler. Se declara con defineRpc.

ts
import type { RpcDefinition } from "@meekojs/meeko/server";

Código fuente src/server/rpc/contracts.ts:20

Declaración #

ts
interface RpcDefinition<I extends Schema, O extends Schema, S = unknown, L = undefined> {
	input: I
	output: O
	auth?: 'required' | 'optional'
	origin?: 'required' | 'none'
	rateLimit?: RateLimitOptions<S>
	authorize?: (context: RequestContext<S>) => boolean | Promise<boolean>
	locals?: (context: RequestContext<S>) => L | Promise<L>
	handler: (args: { input: Output<I>; context: RequestContext<S>; locals: L }) => Promise<Input<O> | Output<O>> | Input<O> | Output<O>
}

Parámetros de tipo #

I extends Schema

Schema de la entrada.

O extends Schema

Schema de la salida.

S = unknown

Tipo de los servicios.

L = undefined

Valor de locals que recibe el handler; undefined sin locals.

Ejemplo #

ts
import type { RpcDefinition, Schema } from "@meekojs/meeko/server";

type GetUser = RpcDefinition<Schema<{ id: string }>, Schema<{ id: string; name: string }>>;

Propiedades #

input #

propiedad

input: I

Schema de la entrada JSON.

output #

propiedad

output: O

Schema de la salida.

auth #

propiedad opcional

auth?: 'required' | 'optional'

"required" responde 401 UNAUTHENTICATED sin sesión.

origin #

propiedad opcional

origin?: 'required' | 'none'

Comprobación de Origin en las llamadas, que son siempre POST. Desde 1.8, por defecto (sin origin) responden 403 INVALID_ORIGIN si su Origin falta, es null o no es el de la aplicación ni uno de SessionManager.allowedOrigins, haya o no sesión. "required" (desde 1.2) equivale al valor por defecto y lo deja explícito.

"none" (desde 1.2, inseguro) desactiva la comprobación en las llamadas sin sesión, para clientes que no envían Origin, como una app nativa o un servicio, y permite que session.create() cree una sesión sin un Origin permitido. Expone el procedimiento al CSRF y al login CSRF: úselo sólo con otra prueba de que la llamada no viene de otra web. Una llamada con sesión sigue exigiendo Origin y el token CSRF.

rateLimit #

propiedad opcional

rateLimit?: RateLimitOptions<S>

Límite de llamadas (desde 1.2), como { limit: 5, window: "5m" }: por encima responde 429 RATE_LIMITED con Retry-After, tras Origin y CSRF y antes de auth, authorize, la entrada y el handler. Cuenta en el store de sesiones (Redis entre instancias) y, si el store falla, la llamada se rechaza.

authorize #

propiedad opcional

authorize?: (context: RequestContext<S>) => boolean | Promise<boolean>

Devolver false responde 403 FORBIDDEN.

locals #

propiedad opcional

locals?: (context: RequestContext<S>) => L | Promise<L>

Calcula un valor por petición que el handler recibe como locals (desde 1.2), como el usuario actual. Se ejecuta tras Origin, CSRF, auth, authorize y la validación de la entrada, y justo antes del handler; un ApiError que lance (por ejemplo 401 o 403) es la respuesta. Declárelo antes de handler para que TypeScript infiera su tipo.

handler #

propiedad

handler: (args: { input: Output<I>; context: RequestContext<S>; locals: L }) => Promise<Input<O> | Output<O>> | Input<O> | Output<O>

Recibe la entrada validada, el contexto y locals; su resultado se valida con output.

Véase también #

¿Te sirvió esta página?

Añadir un comentario

Se envía al elegir «Sí» o «No». Solo se guardan la página, tu respuesta y el comentario: ni cookies ni datos tuyos.

0 de 2000 caracteres

Editar en GitHub: packages/meeko/src/server/rpc/contracts.ts