1 | 'use strict';
|
2 |
|
3 | const {
|
4 | PassThrough,
|
5 | Transform,
|
6 | Writable,
|
7 | Stream,
|
8 | } = require('stream');
|
9 |
|
10 | const { kellnerErrorStream } = require('./symbols');
|
11 |
|
12 | class UnhandeledErrorsStream extends Writable {
|
13 | constructor() {
|
14 | super({ objectMode: true });
|
15 | }
|
16 |
|
17 | _write(err, _, next) {
|
18 | this.emit('error', err);
|
19 | next();
|
20 | }
|
21 | }
|
22 |
|
23 | class ErrorHandler extends Transform {
|
24 | constructor(handler) {
|
25 | super({ objectMode: true });
|
26 | this.handler = handler;
|
27 | }
|
28 |
|
29 | _transform(err, _, next) {
|
30 | this.handler(err, e => this.push(e || err));
|
31 | next();
|
32 | }
|
33 | }
|
34 |
|
35 | module.exports = class ErrorStream extends PassThrough {
|
36 | constructor() {
|
37 | super({ objectMode: true });
|
38 | this._lastHandler = this;
|
39 | }
|
40 |
|
41 | init(parent) {
|
42 | if (!parent)
|
43 | return this._addErrorHandler(new UnhandeledErrorsStream());
|
44 | return this._addErrorHandler(parent[kellnerErrorStream]);
|
45 | }
|
46 |
|
47 | addErrorHandler(handler) {
|
48 | if (handler[kellnerErrorStream])
|
49 | return this._addErrorHandler(handler[kellnerErrorStream]);
|
50 |
|
51 | if (handler instanceof Stream)
|
52 | return this._addErrorHandler(handler);
|
53 |
|
54 | return this._addErrorHandler(new ErrorHandler(handler));
|
55 | }
|
56 |
|
57 | _addErrorHandler(handler) {
|
58 | this._lastHandler = this._lastHandler.pipe(handler);
|
59 | return this;
|
60 | }
|
61 | };
|