export interface FlowContext { /** * use for transfer data between middlewares. * * for symbol key: TypeScript does not support symbol yet. * use `getState()` and `setState()`. * * @type {object} * @memberof FlowContext */ readonly state: T; /** * return whether the next middleware is a empty middleware. * * @type {boolean} * @memberof FlowContext */ readonly hasNext: boolean; /** * same as `this.state[name]`. * * @template TS * @param {PropertyKey} name * @returns {TS} * @memberof FlowContext */ getState(name: PropertyKey): TS; /** * same as `this.state[name]=value`. * * @param {PropertyKey} name * @param {*} value * @memberof FlowContext */ setState(name: PropertyKey, value: any, readonly?: boolean): void; } export declare type Next = () => Promise; export declare type MiddlewareFunction = (context: FlowContext, next: Next) => Promise; export interface Middleware { invoke(context: FlowContext, next: Next): Promise; } declare type MiddlewareType = Middleware | MiddlewareFunction; export interface MiddlewareFactory { get(ctx: FlowContext): Middleware; } export interface IFlowAppBuilder { use(obj: { invoke(context: FlowContext): Promise; } | ((context: FlowContext) => Promise)): this; useFactory(factory: { get(): { invoke(context: FlowContext): Promise; }; }): this; } export interface IAppBuilder { /** * add a function or a middleware instance. * * @param {MiddlewareType} obj * @returns {this} * @memberof IAppBuilder */ use(obj: MiddlewareType): this; /** * add a middleware factory. * * @param {MiddlewareFactory} factory * @returns {this} * @memberof IAppBuilder */ useFactory(factory: MiddlewareFactory): this; /** * use a new `IBranchBuilder` as single middleware. * * @param {(c: FlowContext) => boolean} condition * @returns {IBranchBuilder} the new `IBranchBuilder` * @memberof IAppBuilder */ branch(condition: (c: FlowContext) => boolean): IBranchBuilder; /** * get a `IFlowAppBuilder` for this `IAppBuilder`. * * `IFlowAppBuilder` is not a middleware. * * @returns {IFlowAppBuilder} * @memberof IAppBuilder */ flow(): IFlowAppBuilder; } export interface IBranchBuilder extends IAppBuilder { else(): IBranchBuilder; } export declare class App implements IAppBuilder { protected _factorys: Array>; constructor(); use(obj: MiddlewareType): this; useFactory(factory: MiddlewareFactory): this; branch(condition: (c: FlowContext) => boolean): IBranchBuilder; flow(): IFlowAppBuilder; /** * if state is a object, assign to context.state. * otherwise assign to context.state.value. * * @template R * @param {object} [state=undefined] * @returns {Promise} * @memberof App */ run(state?: object): Promise; } export {};