/** @format */ import { RegrafContext } from './context' import { Middleware, Composer, MiddlewareFn } from './composer' export interface SceneContextOptions { sessionName: string default?: string ttl?: number } export interface SceneSession { state?: State current?: string expires?: number } export interface SceneContext< TContext extends SceneContextMessageUpdate, State = object > { ctx: TContext scenes: Map> options: SceneContextOptions readonly session: SceneSession state: State readonly current: BaseScene | null reset: () => void enter: ( sceneId: string, initialState?: TNewState, silent?: boolean ) => Promise reenter: () => Promise leave: () => Promise } export interface SceneContextMessageUpdate< State = object > extends RegrafContext { scene: SceneContext } export interface BaseSceneOptions< TContext extends SceneContextMessageUpdate, State = object > { handlers: Middleware[] enterHandlers: Middleware[] leaveHandlers: Middleware[] ttl?: number } export class BaseScene< TContext extends SceneContextMessageUpdate, State = object > extends Composer { constructor(id: string, options?: Partial>) id: string options: BaseSceneOptions enterHandler: Middleware leaveHandler: Middleware ttl?: number enter: (...fns: Middleware[]) => this leave: (...fns: Middleware[]) => this enterMiddleware: () => Middleware leaveMiddleware: () => Middleware } export type Scene< TContext extends SceneContextMessageUpdate, State = object > = BaseScene export type StageOptions = SceneContextOptions export class Stage< TContext extends SceneContextMessageUpdate, State = object > extends Composer { constructor(scenes: Scene[], options?: Partial) register: (...scenes: Scene[]) => this middleware: () => MiddlewareFn static enter: ( sceneId: string, initialState?: Partial, silent?: boolean ) => Middleware> static reenter: () => Middleware> static leave: () => Middleware> }