@gramio/composer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,214 @@
1
+ /** next() continuation function */
2
+ type Next = () => Promise<unknown>;
3
+ /** Middleware function: receives context and next */
4
+ type Middleware<T> = (context: T, next: Next) => unknown;
5
+ /** Composed middleware: next is optional (acts as terminal continuation) */
6
+ type ComposedMiddleware<T> = (context: T, next?: Next) => Promise<unknown>;
7
+ /** Error handler receives an object with error, context, and resolved kind */
8
+ type ErrorHandler<T> = (params: {
9
+ error: unknown;
10
+ context: T;
11
+ kind?: string;
12
+ }) => unknown;
13
+ /** Function that computes additional context properties */
14
+ type DeriveHandler<T, D> = (context: T) => D | Promise<D>;
15
+ /** Lazy middleware factory — called per invocation */
16
+ type LazyFactory<T> = (context: T) => Middleware<T> | Promise<Middleware<T>>;
17
+ /** Single value or array */
18
+ type MaybeArray<T> = T | T[];
19
+ /** Scope level for middleware propagation */
20
+ type Scope = "local" | "scoped" | "global";
21
+ /** Which method created a middleware entry */
22
+ type MiddlewareType = "use" | "derive" | "decorate" | "guard" | "branch" | "route" | "fork" | "tap" | "lazy" | "group" | "extend" | "on";
23
+ /** Read-only projection of a middleware entry for inspect()/trace() */
24
+ interface MiddlewareInfo {
25
+ index: number;
26
+ type: MiddlewareType;
27
+ name?: string;
28
+ scope: Scope;
29
+ plugin?: string;
30
+ }
31
+ /** Trace callback invoked on middleware enter; returns cleanup called on exit */
32
+ type TraceHandler = (entry: MiddlewareInfo, context: any) => ((error?: unknown) => void) | void;
33
+ /** Internal middleware entry with scope annotation and metadata */
34
+ interface ScopedMiddleware<T> {
35
+ fn: Middleware<T>;
36
+ scope: Scope;
37
+ type: MiddlewareType;
38
+ name?: string;
39
+ plugin?: string;
40
+ }
41
+ /** Composer constructor options */
42
+ interface ComposerOptions {
43
+ name?: string;
44
+ seed?: unknown;
45
+ }
46
+
47
+ /**
48
+ * Compose an array of middleware functions into a single middleware.
49
+ * Koa-style onion model: each middleware receives (context, next).
50
+ */
51
+ declare function compose<T>(middlewares: Middleware<T>[]): ComposedMiddleware<T>;
52
+
53
+ /** Route handler: single middleware, array, or Composer instance */
54
+ type RouteHandler<T extends object> = Middleware<T> | Middleware<T>[] | Composer<any, any, any>;
55
+ /** Route builder passed to the builder-callback overload of route() */
56
+ interface RouteBuilder<T extends object, K extends string> {
57
+ /** Register a route. Returns a pre-typed Composer for chaining derive/use/guard etc. */
58
+ on(key: K, ...middleware: Middleware<T>[]): Composer<T, T, {}>;
59
+ /** Fallback when router returns undefined or key has no handler */
60
+ otherwise(...middleware: Middleware<T>[]): void;
61
+ }
62
+ declare class Composer<TIn extends object = {}, TOut extends TIn = TIn, TExposed extends object = {}> {
63
+ "~": {
64
+ middlewares: ScopedMiddleware<any>[];
65
+ onErrors: ErrorHandler<any>[];
66
+ extended: Set<string>;
67
+ compiled: ComposedMiddleware<any> | null;
68
+ name: string | undefined;
69
+ seed: unknown;
70
+ errorsDefinitions: Record<string, {
71
+ new (...args: any): any;
72
+ prototype: Error;
73
+ }>;
74
+ tracer: TraceHandler | undefined;
75
+ };
76
+ constructor(options?: ComposerOptions);
77
+ invalidate(): void;
78
+ decorate<D extends object>(values: D): Composer<TIn, TOut & D, TExposed>;
79
+ decorate<D extends object>(values: D, options: {
80
+ as: "scoped" | "global";
81
+ }): Composer<TIn, TOut & D, TExposed & D>;
82
+ use(...middleware: Middleware<TOut>[]): Composer<TIn, TOut, TExposed>;
83
+ derive<D extends object>(handler: DeriveHandler<TOut, D>): Composer<TIn, TOut & D, TExposed>;
84
+ derive<D extends object>(handler: DeriveHandler<TOut, D>, options: {
85
+ as: "scoped" | "global";
86
+ }): Composer<TIn, TOut & D, TExposed & D>;
87
+ guard<S extends TOut>(predicate: ((context: TOut) => context is S) | ((context: TOut) => boolean | Promise<boolean>), ...middleware: Middleware<any>[]): Composer<TIn, TOut, TExposed>;
88
+ branch(predicate: ((context: TOut) => boolean | Promise<boolean>) | boolean, onTrue: Middleware<TOut>, onFalse?: Middleware<TOut>): Composer<TIn, TOut, TExposed>;
89
+ route<K extends string>(router: (context: TOut) => K | undefined | Promise<K | undefined>, builder: (route: RouteBuilder<TOut, K>) => void): Composer<TIn, TOut, TExposed>;
90
+ route<K extends string>(router: (context: TOut) => K | undefined | Promise<K | undefined>, cases: Partial<Record<K, Middleware<TOut> | Middleware<TOut>[] | Composer<any, any, any>>>, fallback?: Middleware<TOut> | Middleware<TOut>[] | Composer<any, any, any>): Composer<TIn, TOut, TExposed>;
91
+ fork(...middleware: Middleware<TOut>[]): Composer<TIn, TOut, TExposed>;
92
+ tap(...middleware: Middleware<TOut>[]): Composer<TIn, TOut, TExposed>;
93
+ lazy(factory: LazyFactory<TOut>): Composer<TIn, TOut, TExposed>;
94
+ onError(handler: ErrorHandler<TOut>): Composer<TIn, TOut, TExposed>;
95
+ when<UOut extends TOut>(condition: boolean, fn: (composer: Composer<TOut, TOut, {}>) => Composer<TOut, UOut, any>): Composer<TIn, TOut & Partial<Omit<UOut, keyof TOut>>, TExposed>;
96
+ error(kind: string, errorClass: {
97
+ new (...args: any): any;
98
+ prototype: Error;
99
+ }): this;
100
+ as(scope: "scoped" | "global"): Composer<TIn, TOut, TOut>;
101
+ group(fn: (composer: Composer<TOut, TOut, {}>) => void): Composer<TIn, TOut, TExposed>;
102
+ extend<UIn extends object, UOut extends UIn, UExposed extends object>(other: Composer<UIn, UOut, UExposed>): Composer<TIn, TOut & UExposed, TExposed>;
103
+ inspect(): MiddlewareInfo[];
104
+ trace(handler: TraceHandler): this;
105
+ compose(): ComposedMiddleware<TIn>;
106
+ run(context: TIn, next?: Next): Promise<void>;
107
+ }
108
+
109
+ /**
110
+ * Concurrent event queue with graceful shutdown support.
111
+ * Processes events in parallel (like an event loop), not sequentially.
112
+ */
113
+ declare class EventQueue<T> {
114
+ private handler;
115
+ private queue;
116
+ private pendingUpdates;
117
+ private active;
118
+ private idleResolvers;
119
+ constructor(handler: (event: T) => Promise<unknown>);
120
+ add(event: T): void;
121
+ addBatch(events: T[]): void;
122
+ stop(timeout?: number): Promise<void>;
123
+ onIdle(): Promise<void>;
124
+ get pending(): number;
125
+ get queued(): number;
126
+ get isActive(): boolean;
127
+ private process;
128
+ private checkIdle;
129
+ }
130
+
131
+ /**
132
+ * Distributes over E to create a correlated union:
133
+ * each event branch gets its own TEventMap entry + per-event derives.
134
+ *
135
+ * Single event → simple intersection.
136
+ * Array of events → discriminated union where each branch has correct derives.
137
+ */
138
+ type ResolveEventCtx<TOut extends object, TEventMap extends Record<string, any>, TDerives extends Record<string, object>, E extends string> = E extends any ? TOut & (E extends keyof TEventMap ? TEventMap[E] : {}) & (E extends keyof TDerives ? TDerives[E] : {}) : never;
139
+ /** EventComposer interface — Composer + .on() + per-event derive tracking */
140
+ interface EventComposer<TBase extends object, TEventMap extends Record<string, TBase>, TIn extends TBase = TBase, TOut extends TIn = TIn, TExposed extends object = {}, TDerives extends Record<string, object> = {}> {
141
+ on<E extends keyof TEventMap & string>(event: MaybeArray<E>, handler: Middleware<ResolveEventCtx<TOut, TEventMap, TDerives, E>>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
142
+ decorate<D extends object>(values: D): EventComposer<TBase, TEventMap, TIn, TOut & D, TExposed, TDerives>;
143
+ decorate<D extends object>(values: D, options: {
144
+ as: "scoped" | "global";
145
+ }): EventComposer<TBase, TEventMap, TIn, TOut & D, TExposed & D, TDerives>;
146
+ use(...middleware: Middleware<TOut>[]): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
147
+ derive<D extends object>(handler: DeriveHandler<TOut, D>): EventComposer<TBase, TEventMap, TIn, TOut & D, TExposed, TDerives>;
148
+ derive<D extends object>(handler: DeriveHandler<TOut, D>, options: {
149
+ as: "scoped" | "global";
150
+ }): EventComposer<TBase, TEventMap, TIn, TOut & D, TExposed & D, TDerives>;
151
+ derive<E extends keyof TEventMap & string, D extends object>(event: MaybeArray<E>, handler: DeriveHandler<ResolveEventCtx<TOut, TEventMap, TDerives, E>, D>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives & {
152
+ [K in E]: D;
153
+ }>;
154
+ guard<S extends TOut>(predicate: ((context: TOut) => context is S) | ((context: TOut) => boolean | Promise<boolean>), ...middleware: Middleware<any>[]): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
155
+ branch(predicate: ((context: TOut) => boolean | Promise<boolean>) | boolean, onTrue: Middleware<TOut>, onFalse?: Middleware<TOut>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
156
+ route<K extends string>(router: (context: TOut) => K | undefined | Promise<K | undefined>, cases: Partial<Record<K, (composer: Composer<TOut, TOut, {}>) => Composer<any, any, any>>>, fallback?: (composer: Composer<TOut, TOut, {}>) => Composer<any, any, any>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
157
+ route<K extends string>(router: (context: TOut) => K | undefined | Promise<K | undefined>, builder: (route: RouteBuilder<TOut, K>) => void): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
158
+ route<K extends string>(router: (context: TOut) => K | undefined | Promise<K | undefined>, cases: Partial<Record<K, Middleware<TOut> | Middleware<TOut>[] | Composer<any, any, any>>>, fallback?: Middleware<TOut> | Middleware<TOut>[] | Composer<any, any, any>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
159
+ fork(...middleware: Middleware<TOut>[]): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
160
+ tap(...middleware: Middleware<TOut>[]): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
161
+ lazy(factory: LazyFactory<TOut>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
162
+ onError(handler: ErrorHandler<TOut>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
163
+ when<UOut extends TOut>(condition: boolean, fn: (composer: Composer<TOut, TOut, {}>) => Composer<TOut, UOut, any>): EventComposer<TBase, TEventMap, TIn, TOut & Partial<Omit<UOut, keyof TOut>>, TExposed, TDerives>;
164
+ error(kind: string, errorClass: {
165
+ new (...args: any): any;
166
+ prototype: Error;
167
+ }): this;
168
+ as(scope: "scoped" | "global"): EventComposer<TBase, TEventMap, TIn, TOut, TOut, TDerives>;
169
+ group(fn: (composer: Composer<TOut, TOut, {}>) => void): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
170
+ extend<UIn extends TBase, UOut extends UIn, UExposed extends object, UDerives extends Record<string, object>>(other: EventComposer<TBase, TEventMap, UIn, UOut, UExposed, UDerives>): EventComposer<TBase, TEventMap, TIn, TOut & UExposed, TExposed, TDerives & UDerives>;
171
+ extend<UIn extends object, UOut extends UIn, UExposed extends object>(other: Composer<UIn, UOut, UExposed>): EventComposer<TBase, TEventMap, TIn, TOut & UExposed, TExposed, TDerives>;
172
+ inspect(): MiddlewareInfo[];
173
+ trace(handler: TraceHandler): this;
174
+ compose(): ComposedMiddleware<TIn>;
175
+ run(context: TIn, next?: Next): Promise<void>;
176
+ "~": {
177
+ middlewares: ScopedMiddleware<any>[];
178
+ onErrors: ErrorHandler<any>[];
179
+ extended: Set<string>;
180
+ compiled: ComposedMiddleware<any> | null;
181
+ name: string | undefined;
182
+ seed: unknown;
183
+ errorsDefinitions: Record<string, {
184
+ new (...args: any): any;
185
+ prototype: Error;
186
+ }>;
187
+ tracer: TraceHandler | undefined;
188
+ Derives: TDerives;
189
+ };
190
+ invalidate(): void;
191
+ }
192
+ interface EventComposerConstructor<TBase extends object, TEventMap extends Record<string, TBase>> {
193
+ new <TIn extends TBase = TBase, TOut extends TIn = TIn, TExposed extends object = {}, TDerives extends Record<string, object> = {}>(options?: ComposerOptions): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
194
+ }
195
+ /**
196
+ * Creates a configured Composer class with type-safe .on() event discrimination.
197
+ */
198
+ declare function createComposer<TBase extends object, TEventMap extends Record<string, TBase> = {}>(config: {
199
+ discriminator: (context: TBase) => string;
200
+ }): {
201
+ Composer: EventComposerConstructor<TBase, TEventMap>;
202
+ compose: typeof compose;
203
+ EventQueue: typeof EventQueue;
204
+ };
205
+
206
+ /** No-op next function: () => Promise.resolve() */
207
+ declare const noopNext: Next;
208
+ /** Pass-through middleware: calls next() immediately */
209
+ declare const skip: Middleware<any>;
210
+ /** Terminal middleware: does NOT call next() */
211
+ declare const stop: Middleware<any>;
212
+
213
+ export { Composer, EventQueue, compose, createComposer, noopNext, skip, stop };
214
+ export type { ComposedMiddleware, ComposerOptions, DeriveHandler, ErrorHandler, EventComposer, EventComposerConstructor, LazyFactory, MaybeArray, Middleware, MiddlewareInfo, MiddlewareType, Next, RouteBuilder, RouteHandler, Scope, TraceHandler };
@@ -0,0 +1,214 @@
1
+ /** next() continuation function */
2
+ type Next = () => Promise<unknown>;
3
+ /** Middleware function: receives context and next */
4
+ type Middleware<T> = (context: T, next: Next) => unknown;
5
+ /** Composed middleware: next is optional (acts as terminal continuation) */
6
+ type ComposedMiddleware<T> = (context: T, next?: Next) => Promise<unknown>;
7
+ /** Error handler receives an object with error, context, and resolved kind */
8
+ type ErrorHandler<T> = (params: {
9
+ error: unknown;
10
+ context: T;
11
+ kind?: string;
12
+ }) => unknown;
13
+ /** Function that computes additional context properties */
14
+ type DeriveHandler<T, D> = (context: T) => D | Promise<D>;
15
+ /** Lazy middleware factory — called per invocation */
16
+ type LazyFactory<T> = (context: T) => Middleware<T> | Promise<Middleware<T>>;
17
+ /** Single value or array */
18
+ type MaybeArray<T> = T | T[];
19
+ /** Scope level for middleware propagation */
20
+ type Scope = "local" | "scoped" | "global";
21
+ /** Which method created a middleware entry */
22
+ type MiddlewareType = "use" | "derive" | "decorate" | "guard" | "branch" | "route" | "fork" | "tap" | "lazy" | "group" | "extend" | "on";
23
+ /** Read-only projection of a middleware entry for inspect()/trace() */
24
+ interface MiddlewareInfo {
25
+ index: number;
26
+ type: MiddlewareType;
27
+ name?: string;
28
+ scope: Scope;
29
+ plugin?: string;
30
+ }
31
+ /** Trace callback invoked on middleware enter; returns cleanup called on exit */
32
+ type TraceHandler = (entry: MiddlewareInfo, context: any) => ((error?: unknown) => void) | void;
33
+ /** Internal middleware entry with scope annotation and metadata */
34
+ interface ScopedMiddleware<T> {
35
+ fn: Middleware<T>;
36
+ scope: Scope;
37
+ type: MiddlewareType;
38
+ name?: string;
39
+ plugin?: string;
40
+ }
41
+ /** Composer constructor options */
42
+ interface ComposerOptions {
43
+ name?: string;
44
+ seed?: unknown;
45
+ }
46
+
47
+ /**
48
+ * Compose an array of middleware functions into a single middleware.
49
+ * Koa-style onion model: each middleware receives (context, next).
50
+ */
51
+ declare function compose<T>(middlewares: Middleware<T>[]): ComposedMiddleware<T>;
52
+
53
+ /** Route handler: single middleware, array, or Composer instance */
54
+ type RouteHandler<T extends object> = Middleware<T> | Middleware<T>[] | Composer<any, any, any>;
55
+ /** Route builder passed to the builder-callback overload of route() */
56
+ interface RouteBuilder<T extends object, K extends string> {
57
+ /** Register a route. Returns a pre-typed Composer for chaining derive/use/guard etc. */
58
+ on(key: K, ...middleware: Middleware<T>[]): Composer<T, T, {}>;
59
+ /** Fallback when router returns undefined or key has no handler */
60
+ otherwise(...middleware: Middleware<T>[]): void;
61
+ }
62
+ declare class Composer<TIn extends object = {}, TOut extends TIn = TIn, TExposed extends object = {}> {
63
+ "~": {
64
+ middlewares: ScopedMiddleware<any>[];
65
+ onErrors: ErrorHandler<any>[];
66
+ extended: Set<string>;
67
+ compiled: ComposedMiddleware<any> | null;
68
+ name: string | undefined;
69
+ seed: unknown;
70
+ errorsDefinitions: Record<string, {
71
+ new (...args: any): any;
72
+ prototype: Error;
73
+ }>;
74
+ tracer: TraceHandler | undefined;
75
+ };
76
+ constructor(options?: ComposerOptions);
77
+ invalidate(): void;
78
+ decorate<D extends object>(values: D): Composer<TIn, TOut & D, TExposed>;
79
+ decorate<D extends object>(values: D, options: {
80
+ as: "scoped" | "global";
81
+ }): Composer<TIn, TOut & D, TExposed & D>;
82
+ use(...middleware: Middleware<TOut>[]): Composer<TIn, TOut, TExposed>;
83
+ derive<D extends object>(handler: DeriveHandler<TOut, D>): Composer<TIn, TOut & D, TExposed>;
84
+ derive<D extends object>(handler: DeriveHandler<TOut, D>, options: {
85
+ as: "scoped" | "global";
86
+ }): Composer<TIn, TOut & D, TExposed & D>;
87
+ guard<S extends TOut>(predicate: ((context: TOut) => context is S) | ((context: TOut) => boolean | Promise<boolean>), ...middleware: Middleware<any>[]): Composer<TIn, TOut, TExposed>;
88
+ branch(predicate: ((context: TOut) => boolean | Promise<boolean>) | boolean, onTrue: Middleware<TOut>, onFalse?: Middleware<TOut>): Composer<TIn, TOut, TExposed>;
89
+ route<K extends string>(router: (context: TOut) => K | undefined | Promise<K | undefined>, builder: (route: RouteBuilder<TOut, K>) => void): Composer<TIn, TOut, TExposed>;
90
+ route<K extends string>(router: (context: TOut) => K | undefined | Promise<K | undefined>, cases: Partial<Record<K, Middleware<TOut> | Middleware<TOut>[] | Composer<any, any, any>>>, fallback?: Middleware<TOut> | Middleware<TOut>[] | Composer<any, any, any>): Composer<TIn, TOut, TExposed>;
91
+ fork(...middleware: Middleware<TOut>[]): Composer<TIn, TOut, TExposed>;
92
+ tap(...middleware: Middleware<TOut>[]): Composer<TIn, TOut, TExposed>;
93
+ lazy(factory: LazyFactory<TOut>): Composer<TIn, TOut, TExposed>;
94
+ onError(handler: ErrorHandler<TOut>): Composer<TIn, TOut, TExposed>;
95
+ when<UOut extends TOut>(condition: boolean, fn: (composer: Composer<TOut, TOut, {}>) => Composer<TOut, UOut, any>): Composer<TIn, TOut & Partial<Omit<UOut, keyof TOut>>, TExposed>;
96
+ error(kind: string, errorClass: {
97
+ new (...args: any): any;
98
+ prototype: Error;
99
+ }): this;
100
+ as(scope: "scoped" | "global"): Composer<TIn, TOut, TOut>;
101
+ group(fn: (composer: Composer<TOut, TOut, {}>) => void): Composer<TIn, TOut, TExposed>;
102
+ extend<UIn extends object, UOut extends UIn, UExposed extends object>(other: Composer<UIn, UOut, UExposed>): Composer<TIn, TOut & UExposed, TExposed>;
103
+ inspect(): MiddlewareInfo[];
104
+ trace(handler: TraceHandler): this;
105
+ compose(): ComposedMiddleware<TIn>;
106
+ run(context: TIn, next?: Next): Promise<void>;
107
+ }
108
+
109
+ /**
110
+ * Concurrent event queue with graceful shutdown support.
111
+ * Processes events in parallel (like an event loop), not sequentially.
112
+ */
113
+ declare class EventQueue<T> {
114
+ private handler;
115
+ private queue;
116
+ private pendingUpdates;
117
+ private active;
118
+ private idleResolvers;
119
+ constructor(handler: (event: T) => Promise<unknown>);
120
+ add(event: T): void;
121
+ addBatch(events: T[]): void;
122
+ stop(timeout?: number): Promise<void>;
123
+ onIdle(): Promise<void>;
124
+ get pending(): number;
125
+ get queued(): number;
126
+ get isActive(): boolean;
127
+ private process;
128
+ private checkIdle;
129
+ }
130
+
131
+ /**
132
+ * Distributes over E to create a correlated union:
133
+ * each event branch gets its own TEventMap entry + per-event derives.
134
+ *
135
+ * Single event → simple intersection.
136
+ * Array of events → discriminated union where each branch has correct derives.
137
+ */
138
+ type ResolveEventCtx<TOut extends object, TEventMap extends Record<string, any>, TDerives extends Record<string, object>, E extends string> = E extends any ? TOut & (E extends keyof TEventMap ? TEventMap[E] : {}) & (E extends keyof TDerives ? TDerives[E] : {}) : never;
139
+ /** EventComposer interface — Composer + .on() + per-event derive tracking */
140
+ interface EventComposer<TBase extends object, TEventMap extends Record<string, TBase>, TIn extends TBase = TBase, TOut extends TIn = TIn, TExposed extends object = {}, TDerives extends Record<string, object> = {}> {
141
+ on<E extends keyof TEventMap & string>(event: MaybeArray<E>, handler: Middleware<ResolveEventCtx<TOut, TEventMap, TDerives, E>>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
142
+ decorate<D extends object>(values: D): EventComposer<TBase, TEventMap, TIn, TOut & D, TExposed, TDerives>;
143
+ decorate<D extends object>(values: D, options: {
144
+ as: "scoped" | "global";
145
+ }): EventComposer<TBase, TEventMap, TIn, TOut & D, TExposed & D, TDerives>;
146
+ use(...middleware: Middleware<TOut>[]): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
147
+ derive<D extends object>(handler: DeriveHandler<TOut, D>): EventComposer<TBase, TEventMap, TIn, TOut & D, TExposed, TDerives>;
148
+ derive<D extends object>(handler: DeriveHandler<TOut, D>, options: {
149
+ as: "scoped" | "global";
150
+ }): EventComposer<TBase, TEventMap, TIn, TOut & D, TExposed & D, TDerives>;
151
+ derive<E extends keyof TEventMap & string, D extends object>(event: MaybeArray<E>, handler: DeriveHandler<ResolveEventCtx<TOut, TEventMap, TDerives, E>, D>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives & {
152
+ [K in E]: D;
153
+ }>;
154
+ guard<S extends TOut>(predicate: ((context: TOut) => context is S) | ((context: TOut) => boolean | Promise<boolean>), ...middleware: Middleware<any>[]): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
155
+ branch(predicate: ((context: TOut) => boolean | Promise<boolean>) | boolean, onTrue: Middleware<TOut>, onFalse?: Middleware<TOut>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
156
+ route<K extends string>(router: (context: TOut) => K | undefined | Promise<K | undefined>, cases: Partial<Record<K, (composer: Composer<TOut, TOut, {}>) => Composer<any, any, any>>>, fallback?: (composer: Composer<TOut, TOut, {}>) => Composer<any, any, any>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
157
+ route<K extends string>(router: (context: TOut) => K | undefined | Promise<K | undefined>, builder: (route: RouteBuilder<TOut, K>) => void): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
158
+ route<K extends string>(router: (context: TOut) => K | undefined | Promise<K | undefined>, cases: Partial<Record<K, Middleware<TOut> | Middleware<TOut>[] | Composer<any, any, any>>>, fallback?: Middleware<TOut> | Middleware<TOut>[] | Composer<any, any, any>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
159
+ fork(...middleware: Middleware<TOut>[]): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
160
+ tap(...middleware: Middleware<TOut>[]): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
161
+ lazy(factory: LazyFactory<TOut>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
162
+ onError(handler: ErrorHandler<TOut>): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
163
+ when<UOut extends TOut>(condition: boolean, fn: (composer: Composer<TOut, TOut, {}>) => Composer<TOut, UOut, any>): EventComposer<TBase, TEventMap, TIn, TOut & Partial<Omit<UOut, keyof TOut>>, TExposed, TDerives>;
164
+ error(kind: string, errorClass: {
165
+ new (...args: any): any;
166
+ prototype: Error;
167
+ }): this;
168
+ as(scope: "scoped" | "global"): EventComposer<TBase, TEventMap, TIn, TOut, TOut, TDerives>;
169
+ group(fn: (composer: Composer<TOut, TOut, {}>) => void): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
170
+ extend<UIn extends TBase, UOut extends UIn, UExposed extends object, UDerives extends Record<string, object>>(other: EventComposer<TBase, TEventMap, UIn, UOut, UExposed, UDerives>): EventComposer<TBase, TEventMap, TIn, TOut & UExposed, TExposed, TDerives & UDerives>;
171
+ extend<UIn extends object, UOut extends UIn, UExposed extends object>(other: Composer<UIn, UOut, UExposed>): EventComposer<TBase, TEventMap, TIn, TOut & UExposed, TExposed, TDerives>;
172
+ inspect(): MiddlewareInfo[];
173
+ trace(handler: TraceHandler): this;
174
+ compose(): ComposedMiddleware<TIn>;
175
+ run(context: TIn, next?: Next): Promise<void>;
176
+ "~": {
177
+ middlewares: ScopedMiddleware<any>[];
178
+ onErrors: ErrorHandler<any>[];
179
+ extended: Set<string>;
180
+ compiled: ComposedMiddleware<any> | null;
181
+ name: string | undefined;
182
+ seed: unknown;
183
+ errorsDefinitions: Record<string, {
184
+ new (...args: any): any;
185
+ prototype: Error;
186
+ }>;
187
+ tracer: TraceHandler | undefined;
188
+ Derives: TDerives;
189
+ };
190
+ invalidate(): void;
191
+ }
192
+ interface EventComposerConstructor<TBase extends object, TEventMap extends Record<string, TBase>> {
193
+ new <TIn extends TBase = TBase, TOut extends TIn = TIn, TExposed extends object = {}, TDerives extends Record<string, object> = {}>(options?: ComposerOptions): EventComposer<TBase, TEventMap, TIn, TOut, TExposed, TDerives>;
194
+ }
195
+ /**
196
+ * Creates a configured Composer class with type-safe .on() event discrimination.
197
+ */
198
+ declare function createComposer<TBase extends object, TEventMap extends Record<string, TBase> = {}>(config: {
199
+ discriminator: (context: TBase) => string;
200
+ }): {
201
+ Composer: EventComposerConstructor<TBase, TEventMap>;
202
+ compose: typeof compose;
203
+ EventQueue: typeof EventQueue;
204
+ };
205
+
206
+ /** No-op next function: () => Promise.resolve() */
207
+ declare const noopNext: Next;
208
+ /** Pass-through middleware: calls next() immediately */
209
+ declare const skip: Middleware<any>;
210
+ /** Terminal middleware: does NOT call next() */
211
+ declare const stop: Middleware<any>;
212
+
213
+ export { Composer, EventQueue, compose, createComposer, noopNext, skip, stop };
214
+ export type { ComposedMiddleware, ComposerOptions, DeriveHandler, ErrorHandler, EventComposer, EventComposerConstructor, LazyFactory, MaybeArray, Middleware, MiddlewareInfo, MiddlewareType, Next, RouteBuilder, RouteHandler, Scope, TraceHandler };