import type { Composer } from '.';
import type { ValidateAdapter } from 'src/validators/types';
import * as JSONRPC from '../specs/JSONRPC_V2/types';
export interface MethodDescription {
    key: PropKey;
    descriptor: PropertyDescriptor;
    target: Target;
    validators: Validators;
    argNames: string[];
    metadata: MethodMetadata;
    use: Middleware<Event, Context, {}>[];
}
export interface PartialMethodDescription {
    key: PropKey;
    descriptor?: PropertyDescriptor;
    target: Target;
    validators?: Validators;
    argNames?: string[];
    metadata?: MethodMetadata;
    use?: Middleware<Event, Context, {}>[];
}
export interface Validators {
    in?: {
        [k: number]: unknown;
    };
    out?: unknown;
}
export interface MethodConfig extends Validators {
    use?: Middleware<Event, Context, {}> | Middleware<Event, Context, {}>[];
}
export interface PropertyDescription {
    key: PropKey;
    target: Target;
}
export interface MethodMetadata {
    returnType?: string;
    argsType?: string[];
}
export interface Schema {
    route: string;
    methods: Record<string, MethodMetadata>;
    models: string[];
}
export interface ComposerConfig {
    route?: string;
    onError?: ErrorCallback;
    validator?: ValidateAdapter;
}
export interface Target {
    constructor: {
        name: string;
    };
}
export type PropKey = string | symbol;
export type ClassConstructor<T extends object> = new (...params: unknown[]) => T;
export type Middleware<Event, Ctx, Extension> = (event: Event, ctx: Ctx, next: CallableFunction) => Promise<(Ctx & Extension) | void>;
export type Composed<T extends {
    [s: string]: object;
}> = Composer<T> & T;
export type Event = {
    request: Request;
    [key: string]: unknown;
} | Request;
export type Context = {
    body: JSONRPC.Request<JSONRPC.Parameters>;
} & Record<string, unknown>;
export type ModifiedContext<T> = T extends (infer Mw extends (...args: unknown[]) => unknown)[] ? Awaited<ReturnType<Mw>> : T;
//# sourceMappingURL=types.d.ts.map