1 | import { Pipeline, PipelineEntry, MiddlewareMethod } from '../types/middleware'
|
2 |
|
3 | export default class MiddlewarePipeline<T,U> implements Pipeline<T,U> {
|
4 | private entries: PipelineEntry<T,U>[] = []
|
5 |
|
6 | insertFirst (entry: PipelineEntry<T,U>) {
|
7 | this.entries = [entry, ...this.entries]
|
8 | }
|
9 |
|
10 | insertLast (entry: PipelineEntry<T,U>) {
|
11 | this.entries = [...this.entries, entry]
|
12 | }
|
13 |
|
14 | insertBefore (middlewareName: string, entry: PipelineEntry<T,U>) {
|
15 | const pipelineNames = this.entries.map((m: PipelineEntry<T,U>) => m.name)
|
16 | const index = pipelineNames.indexOf(middlewareName)
|
17 |
|
18 | if (index === -1) {
|
19 | throw new Error(`could not insert before middleware; not found. name=${middlewareName}`)
|
20 | }
|
21 |
|
22 | this.entries = [
|
23 | ...this.entries.slice(0, index),
|
24 | entry,
|
25 | ...this.entries.slice(index)
|
26 | ]
|
27 | }
|
28 |
|
29 | insertAfter (middlewareName: string, entry: PipelineEntry<T,U>) {
|
30 | const pipelineNames = this.entries.map((m: PipelineEntry<T,U>) => m.name)
|
31 | const index = pipelineNames.indexOf(middlewareName)
|
32 |
|
33 | if (index === -1) {
|
34 | throw new Error(`could not insert after middleware; not found. name=${middlewareName}`)
|
35 | }
|
36 |
|
37 | this.entries = [
|
38 | ...this.entries.slice(0, index + 1),
|
39 | entry,
|
40 | ...this.entries.slice(index + 1)
|
41 | ]
|
42 | }
|
43 |
|
44 | getMethods (): MiddlewareMethod<T,U>[] {
|
45 | return this.entries.map(e => e.method)
|
46 | }
|
47 | }
|