1 | 'use strict';
|
2 |
|
3 | const KellnerRouter = require('./KellnerRouter');
|
4 |
|
5 | const { kellnerApp, kellnerPipeline } = require('../symbols');
|
6 | const KellnerRoute = require('./KellnerRoute');
|
7 |
|
8 | const { KellnerPassThrough, KellnerMiddleware } = require('../streams');
|
9 | const { flatten } = require('../utils');
|
10 |
|
11 | class Incoming {
|
12 | constructor(app) {
|
13 | this[kellnerApp] = app;
|
14 | this[kellnerPipeline] = new KellnerPassThrough(this.app);
|
15 | }
|
16 |
|
17 | use(route, ...middlewares) {
|
18 | if (!middlewares.length === 0) {
|
19 | middlewares = route;
|
20 | route = KellnerRoute.rootRoute;
|
21 | }
|
22 |
|
23 | middlewares = flatten(middlewares);
|
24 |
|
25 | if (middlewares.length === 0)
|
26 | throw new TypeError('use() requires a middleware function or stream');
|
27 |
|
28 |
|
29 | if (route === KellnerRoute.rootRoute)
|
30 | return this._use(KellnerMiddleware.wrap(this[kellnerApp], middlewares));
|
31 |
|
32 |
|
33 | return this._route(route, middlewares);
|
34 | }
|
35 |
|
36 | _write(data, _, next) {
|
37 | this._pipeStart.write(data);
|
38 | next();
|
39 | }
|
40 |
|
41 | _repipe(dst) {
|
42 | this[kellnerPipeline] = this[kellnerPipeline].pipe(dst);
|
43 | }
|
44 |
|
45 | _route(route, middlewares) {
|
46 | const stream = KellnerMiddleware.wrap(this[kellnerApp], middlewares);
|
47 |
|
48 | if (!this[route.name]) {
|
49 | this[route.name] = stream;
|
50 | this._use(new KellnerRouter(this.app, route, stream));
|
51 | return this;
|
52 | }
|
53 |
|
54 | this[route.name] = this[route.name].pipe(middlewares);
|
55 |
|
56 | return this;
|
57 | }
|
58 |
|
59 | _use(middleware) {
|
60 | this._repipe(middleware);
|
61 | return this;
|
62 | }
|
63 | }
|
64 |
|
65 | module.exports = Incoming;
|