UNPKG

1.22 kBJavaScriptView Raw
1'use strict';
2
3const {
4 PassThrough,
5 Transform,
6 Writable,
7 Stream,
8} = require('stream');
9
10const { kellnerErrorStream } = require('./symbols');
11
12class UnhandeledErrorsStream extends Writable {
13 constructor() {
14 super({ objectMode: true });
15 }
16
17 _write(err, _, next) { // eslint-disable-line
18 this.emit('error', err);
19 next();
20 }
21}
22
23class 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
35module.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};