| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -27,6 +27,7 @@ | |||
| 27 | 27 | ||
| 28 | 28 | const { | |
| 29 | 29 | FunctionPrototype, | |
| 30 | + Error, | ||
| 30 | 31 | ObjectDefineProperty, | |
| 31 | 32 | ObjectDefineProperties, | |
| 32 | 33 | ObjectSetPrototypeOf, | |
@@ -290,8 +291,8 @@ Writable.prototype.pipe = function() { | |||
| 290 | 291 | errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); | |
| 291 | 292 | }; | |
| 292 | 293 | ||
| 293 | - Writable.prototype.write = function(chunk, encoding, cb) { | ||
| 294 | - const state = this._writableState; | ||
| 294 | + function _write(stream, chunk, encoding, cb) { | ||
| 295 | + const state = stream._writableState; | ||
| 295 | 296 | ||
| 296 | 297 | if (typeof encoding === 'function') { | |
| 297 | 298 | cb = encoding; | |
@@ -333,11 +334,15 @@ Writable.prototype.write = function(chunk, encoding, cb) { | |||
| 333 | 334 | ||
| 334 | 335 | if (err) { | |
| 335 | 336 | process.nextTick(cb, err); | |
| 336 | - errorOrDestroy(this, err, true); | ||
| 337 | - return false; | ||
| 337 | + errorOrDestroy(stream, err, true); | ||
| 338 | + return err; | ||
| 338 | 339 | } | |
| 339 | 340 | state.pendingcb++; | |
| 340 | - return writeOrBuffer(this, state, chunk, encoding, cb); | ||
| 341 | + return writeOrBuffer(stream, state, chunk, encoding, cb); | ||
| 342 | + } | ||
| 343 | + | ||
| 344 | + Writable.prototype.write = function(chunk, encoding, cb) { | ||
| 345 | + return _write(this, chunk, encoding, cb) === true; | ||
| 341 | 346 | }; | |
| 342 | 347 | ||
| 343 | 348 | Writable.prototype.cork = function() { | |
@@ -607,21 +612,30 @@ Writable.prototype.end = function(chunk, encoding, cb) { | |||
| 607 | 612 | encoding = null; | |
| 608 | 613 | } | |
| 609 | 614 | ||
| 610 | - if (chunk !== null && chunk !== undefined) | ||
| 611 | - this.write(chunk, encoding); | ||
| 615 | + let err; | ||
| 616 | + | ||
| 617 | + if (chunk !== null && chunk !== undefined) { | ||
| 618 | + const ret = _write(this, chunk, encoding); | ||
| 619 | + if (ret instanceof Error) { | ||
| 620 | + err = ret; | ||
| 621 | + } | ||
| 622 | + } | ||
| 612 | 623 | ||
| 613 | 624 | // .end() fully uncorks. | |
| 614 | 625 | if (state.corked) { | |
| 615 | 626 | state.corked = 1; | |
| 616 | 627 | this.uncork(); | |
| 617 | 628 | } | |
| 618 | 629 | ||
| 619 | - // This is forgiving in terms of unnecessary calls to end() and can hide | ||
| 620 | - // logic errors. However, usually such errors are harmless and causing a | ||
| 621 | - // hard error can be disproportionately destructive. It is not always | ||
| 622 | - // trivial for the user to determine whether end() needs to be called or not. | ||
| 623 | - let err; | ||
| 624 | - if (!state.errored && !state.ending) { | ||
| 630 | + if (err) { | ||
| 631 | + // Do nothing... | ||
| 632 | + } else if (!state.errored && !state.ending) { | ||
| 633 | + // This is forgiving in terms of unnecessary calls to end() and can hide | ||
| 634 | + // logic errors. However, usually such errors are harmless and causing a | ||
| 635 | + // hard error can be disproportionately destructive. It is not always | ||
| 636 | + // trivial for the user to determine whether end() needs to be called | ||
| 637 | + // or not. | ||
| 638 | + | ||
| 625 | 639 | state.ending = true; | |
| 626 | 640 | finishMaybe(this, state, true); | |
| 627 | 641 | state.ended = true; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -46,3 +46,38 @@ const stream = require('stream'); | |||
| 46 | 46 | writable.emit('error', new Error('kaboom')); | |
| 47 | 47 | })); | |
| 48 | 48 | } | |
| 49 | + | ||
| 50 | + { | ||
| 51 | + const w = new stream.Writable({ | ||
| 52 | + write(chunk, encoding, callback) { | ||
| 53 | + setImmediate(callback); | ||
| 54 | + }, | ||
| 55 | + finish(callback) { | ||
| 56 | + setImmediate(callback); | ||
| 57 | + } | ||
| 58 | + }); | ||
| 59 | + w.end('testing ended state', common.mustCall((err) => { | ||
| 60 | + // This errors since .destroy(err), which is invoked by errors | ||
| 61 | + // in same tick below, will error all pending callbacks. | ||
| 62 | + // Does this make sense? Not sure. | ||
| 63 | + assert.strictEqual(err.code, 'ERR_STREAM_DESTROYED'); | ||
| 64 | + })); | ||
| 65 | + assert.strictEqual(w.destroyed, false); | ||
| 66 | + assert.strictEqual(w.writableEnded, true); | ||
| 67 | + w.end(common.mustCall((err) => { | ||
| 68 | + // This errors since .destroy(err), which is invoked by errors | ||
| 69 | + // in same tick below, will error all pending callbacks. | ||
| 70 | + // Does this make sense? Not sure. | ||
| 71 | + assert.strictEqual(err.code, 'ERR_STREAM_DESTROYED'); | ||
| 72 | + })); | ||
| 73 | + assert.strictEqual(w.destroyed, false); | ||
| 74 | + assert.strictEqual(w.writableEnded, true); | ||
| 75 | + w.end('end', common.mustCall((err) => { | ||
| 76 | + assert.strictEqual(err.code, 'ERR_STREAM_WRITE_AFTER_END'); | ||
| 77 | + })); | ||
| 78 | + assert.strictEqual(w.destroyed, true); | ||
| 79 | + w.on('error', common.mustCall((err) => { | ||
| 80 | + assert.strictEqual(err.code, 'ERR_STREAM_WRITE_AFTER_END'); | ||
| 81 | + })); | ||
| 82 | + w.on('finish', common.mustNotCall()); | ||
| 83 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments