UNPKG

1.25 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 const targetStream = parent ? parent[kellnerErrorStream] : new UnhandeledErrorsStream();
43 this._lastHandler.on('data', d => targetStream.write(d));
44 return targetStream;
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};