Skip to content

Commit c979488

Browse files
committed
stream: make virtual methods errors consistent
Use the same error code and always emit the error instead of throwing it. PR-URL: #18813 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: Michaë Zasso <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
1 parent 8403f00 commit c979488

9 files changed

+58
-61
lines changed

lib/_http_outgoing.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ OutgoingMessage.prototype.removeHeader = function removeHeader(name) {
616616

617617

618618
OutgoingMessage.prototype._implicitHeader = function _implicitHeader() {
619-
throw new ERR_METHOD_NOT_IMPLEMENTED('_implicitHeader()');
619+
this.emit('error', new ERR_METHOD_NOT_IMPLEMENTED('_implicitHeader()'));
620620
};
621621

622622
Object.defineProperty(OutgoingMessage.prototype, 'headersSent', {

lib/_stream_readable.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const { getHighWaterMark } = require('internal/streams/state');
3535
const {
3636
ERR_INVALID_ARG_TYPE,
3737
ERR_STREAM_PUSH_AFTER_EOF,
38-
ERR_STREAM_READ_NOT_IMPLEMENTED,
38+
ERR_METHOD_NOT_IMPLEMENTED,
3939
ERR_STREAM_UNSHIFT_AFTER_END_EVENT
4040
} = require('internal/errors').codes;
4141
const ReadableAsyncIterator = require('internal/streams/async_iterator');
@@ -568,7 +568,7 @@ function maybeReadMore_(stream, state) {
568568
// for virtual (non-string, non-buffer) streams, "length" is somewhat
569569
// arbitrary, and perhaps not very meaningful.
570570
Readable.prototype._read = function(n) {
571-
this.emit('error', new ERR_STREAM_READ_NOT_IMPLEMENTED());
571+
this.emit('error', new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
572572
};
573573

574574
Readable.prototype.pipe = function(dest, pipeOpts) {

lib/_stream_transform.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ Transform.prototype.push = function(chunk, encoding) {
162162
// an error, then that'll put the hurt on the whole operation. If you
163163
// never call cb(), then you'll never get another chunk.
164164
Transform.prototype._transform = function(chunk, encoding, cb) {
165-
throw new ERR_METHOD_NOT_IMPLEMENTED('_transform');
165+
cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));
166166
};
167167

168168
Transform.prototype._write = function(chunk, encoding, cb) {

lib/_stream_writable.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ function clearBuffer(stream, state) {
553553
}
554554

555555
Writable.prototype._write = function(chunk, encoding, cb) {
556-
cb(new ERR_METHOD_NOT_IMPLEMENTED('_write'));
556+
cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
557557
};
558558

559559
Writable.prototype._writev = null;

lib/internal/errors.js

-1
Original file line numberDiff line numberDiff line change
@@ -849,7 +849,6 @@ E('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable', Error);
849849
E('ERR_STREAM_DESTROYED', 'Cannot call %s after a stream was destroyed', Error);
850850
E('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
851851
E('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF', Error);
852-
E('ERR_STREAM_READ_NOT_IMPLEMENTED', '_read() is not implemented', Error);
853852
E('ERR_STREAM_UNSHIFT_AFTER_END_EVENT',
854853
'stream.unshift() after end event', Error);
855854
E('ERR_STREAM_WRAP', 'Stream has StringDecoder set or is in objectMode', Error);

test/parallel/test-http-outgoing-proto.js

+10-15
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,6 @@ const OutgoingMessage = http.OutgoingMessage;
77
const ClientRequest = http.ClientRequest;
88
const ServerResponse = http.ServerResponse;
99

10-
common.expectsError(
11-
OutgoingMessage.prototype._implicitHeader,
12-
{
13-
code: 'ERR_METHOD_NOT_IMPLEMENTED',
14-
type: Error,
15-
message: 'The _implicitHeader() method is not implemented'
16-
}
17-
);
1810
assert.strictEqual(
1911
typeof ClientRequest.prototype._implicitHeader, 'function');
2012
assert.strictEqual(
@@ -67,14 +59,17 @@ common.expectsError(() => {
6759
});
6860

6961
// write
70-
common.expectsError(() => {
62+
{
7163
const outgoingMessage = new OutgoingMessage();
72-
outgoingMessage.write();
73-
}, {
74-
code: 'ERR_METHOD_NOT_IMPLEMENTED',
75-
type: Error,
76-
message: 'The _implicitHeader() method is not implemented'
77-
});
64+
65+
outgoingMessage.on('error', common.expectsError({
66+
code: 'ERR_METHOD_NOT_IMPLEMENTED',
67+
type: Error,
68+
message: 'The _implicitHeader() method is not implemented'
69+
}));
70+
71+
outgoingMessage.write('');
72+
}
7873

7974
assert(OutgoingMessage.prototype.write.call({ _header: 'test' }));
8075

Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
'use strict';
22
const common = require('../common');
3-
const stream = require('stream');
43

5-
const readable = new stream.Readable();
4+
const { Readable } = require('stream');
65

7-
common.expectsError(() => readable.read(), {
8-
code: 'ERR_STREAM_READ_NOT_IMPLEMENTED',
6+
const readable = new Readable();
7+
8+
readable.on('error', common.expectsError({
9+
code: 'ERR_METHOD_NOT_IMPLEMENTED',
910
type: Error,
10-
message: '_read() is not implemented'
11-
});
11+
message: 'The _read() method is not implemented'
12+
}));
13+
14+
readable.read();

test/parallel/test-stream-transform-constructor-set-methods.js

+16-16
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@ const common = require('../common');
44
const { strictEqual } = require('assert');
55
const { Transform } = require('stream');
66

7+
const t = new Transform();
8+
9+
t.on('error', common.expectsError({
10+
type: Error,
11+
code: 'ERR_METHOD_NOT_IMPLEMENTED',
12+
message: 'The _transform() method is not implemented'
13+
}));
14+
15+
t.end(Buffer.from('blerg'));
16+
717
const _transform = common.mustCall((chunk, _, next) => {
818
next();
919
});
@@ -16,25 +26,15 @@ const _flush = common.mustCall((next) => {
1626
next();
1727
});
1828

19-
const t = new Transform({
29+
const t2 = new Transform({
2030
transform: _transform,
2131
flush: _flush,
2232
final: _final
2333
});
2434

25-
strictEqual(t._transform, _transform);
26-
strictEqual(t._flush, _flush);
27-
strictEqual(t._final, _final);
35+
strictEqual(t2._transform, _transform);
36+
strictEqual(t2._flush, _flush);
37+
strictEqual(t2._final, _final);
2838

29-
t.end(Buffer.from('blerg'));
30-
t.resume();
31-
32-
const t2 = new Transform({});
33-
34-
common.expectsError(() => {
35-
t2.end(Buffer.from('blerg'));
36-
}, {
37-
type: Error,
38-
code: 'ERR_METHOD_NOT_IMPLEMENTED',
39-
message: 'The _transform method is not implemented'
40-
});
39+
t2.end(Buffer.from('blerg'));
40+
t2.resume();

test/parallel/test-stream-writable-constructor-set-methods.js

+18-18
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@ const common = require('../common');
44
const { strictEqual } = require('assert');
55
const { Writable } = require('stream');
66

7+
const w = new Writable();
8+
9+
w.on('error', common.expectsError({
10+
type: Error,
11+
code: 'ERR_METHOD_NOT_IMPLEMENTED',
12+
message: 'The _write() method is not implemented'
13+
}));
14+
15+
w.end(Buffer.from('blerg'));
16+
717
const _write = common.mustCall((chunk, _, next) => {
818
next();
919
});
@@ -13,25 +23,15 @@ const _writev = common.mustCall((chunks, next) => {
1323
next();
1424
});
1525

16-
const w = new Writable({ write: _write, writev: _writev });
26+
const w2 = new Writable({ write: _write, writev: _writev });
1727

18-
strictEqual(w._write, _write);
19-
strictEqual(w._writev, _writev);
28+
strictEqual(w2._write, _write);
29+
strictEqual(w2._writev, _writev);
2030

21-
w.write(Buffer.from('blerg'));
31+
w2.write(Buffer.from('blerg'));
2232

23-
w.cork();
24-
w.write(Buffer.from('blerg'));
25-
w.write(Buffer.from('blerg'));
26-
27-
w.end();
28-
29-
const w2 = new Writable();
30-
31-
w2.on('error', common.expectsError({
32-
type: Error,
33-
code: 'ERR_METHOD_NOT_IMPLEMENTED',
34-
message: 'The _write method is not implemented'
35-
}));
33+
w2.cork();
34+
w2.write(Buffer.from('blerg'));
35+
w2.write(Buffer.from('blerg'));
3636

37-
w2.end(Buffer.from('blerg'));
37+
w2.end();

0 commit comments

Comments
 (0)