-
Notifications
You must be signed in to change notification settings - Fork 383
/
process.ts
36 lines (31 loc) · 1.04 KB
/
process.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { WebClient } from '@slack/web-api';
import { Logger } from '@slack/logger';
import { Middleware, AnyMiddlewareArgs, Context } from '../types';
export default async function processMiddleware(
middleware: Middleware<AnyMiddlewareArgs>[],
initialArgs: AnyMiddlewareArgs,
context: Context,
client: WebClient,
logger: Logger,
last: () => Promise<void>,
): Promise<void> {
let lastCalledMiddlewareIndex = -1;
async function invokeMiddleware(toCallMiddlewareIndex: number): ReturnType<Middleware<AnyMiddlewareArgs>> {
if (lastCalledMiddlewareIndex >= toCallMiddlewareIndex) {
// TODO: use a coded error
throw Error('next() called multiple times');
}
if (toCallMiddlewareIndex < middleware.length) {
lastCalledMiddlewareIndex = toCallMiddlewareIndex;
return middleware[toCallMiddlewareIndex]({
next: () => invokeMiddleware(toCallMiddlewareIndex + 1),
...initialArgs,
context,
client,
logger,
});
}
return last();
}
return invokeMiddleware(0);
}