UNPKG

1.46 kBJavaScriptView Raw
1'use strict';
2
3const KellnerRouter = require('./KellnerRouter');
4
5const { kellnerApp, kellnerPipeline } = require('../symbols');
6const KellnerRoute = require('./KellnerRoute');
7
8const { KellnerPassThrough, KellnerMiddleware } = require('../streams');
9const { flatten } = require('../utils');
10
11class 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 // root middleware
29 if (route === KellnerRoute.rootRoute)
30 return this._use(KellnerMiddleware.wrap(this[kellnerApp], middlewares));
31
32 // routed middleware
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
65module.exports = Incoming;