@@ -196,23 +196,18 @@ function writeAfterEnd(stream, cb) {
196196  process . nextTick ( cb ,  er ) ; 
197197} 
198198
199- // If we get something that is not a buffer, string, null, or undefined, 
200- // and we're not in objectMode, then that's an error. 
201- // Otherwise stream chunks are all considered to be of length=1, and the 
202- // watermarks determine how many objects to keep in the buffer, rather than 
203- // how many bytes or characters. 
199+ // Checks that a user-supplied chunk is valid, especially for the particular 
200+ // mode the stream is in. Currently this means that `null` is never accepted 
201+ // and undefined/non-string values are only allowed in object mode. 
204202function  validChunk ( stream ,  state ,  chunk ,  cb )  { 
205203  var  valid  =  true ; 
206204  var  er  =  false ; 
207-   // Always throw error if a null is written 
208-   // if we are not in object mode then throw 
209-   // if it is not a buffer, string, or undefined. 
205+ 
210206  if  ( chunk  ===  null )  { 
211207    er  =  new  TypeError ( 'May not write null values to stream' ) ; 
212-   }  else  if  ( ! ( chunk  instanceof  Buffer )  && 
213-       typeof  chunk  !==  'string'  && 
214-       chunk  !==  undefined  && 
215-       ! state . objectMode )  { 
208+   }  else  if  ( typeof  chunk  !==  'string'  && 
209+              chunk  !==  undefined  && 
210+              ! state . objectMode )  { 
216211    er  =  new  TypeError ( 'Invalid non-string/buffer chunk' ) ; 
217212  } 
218213  if  ( er )  { 
@@ -226,13 +221,14 @@ function validChunk(stream, state, chunk, cb) {
226221Writable . prototype . write  =  function ( chunk ,  encoding ,  cb )  { 
227222  var  state  =  this . _writableState ; 
228223  var  ret  =  false ; 
224+   var  isBuf  =  ( chunk  instanceof  Buffer ) ; 
229225
230226  if  ( typeof  encoding  ===  'function' )  { 
231227    cb  =  encoding ; 
232228    encoding  =  null ; 
233229  } 
234230
235-   if  ( chunk   instanceof   Buffer ) 
231+   if  ( isBuf ) 
236232    encoding  =  'buffer' ; 
237233  else  if  ( ! encoding ) 
238234    encoding  =  state . defaultEncoding ; 
@@ -242,9 +238,9 @@ Writable.prototype.write = function(chunk, encoding, cb) {
242238
243239  if  ( state . ended ) 
244240    writeAfterEnd ( this ,  cb ) ; 
245-   else  if  ( validChunk ( this ,  state ,  chunk ,  cb ) )  { 
241+   else  if  ( isBuf   ||   validChunk ( this ,  state ,  chunk ,  cb ) )  { 
246242    state . pendingcb ++ ; 
247-     ret  =  writeOrBuffer ( this ,  state ,  chunk ,  encoding ,  cb ) ; 
243+     ret  =  writeOrBuffer ( this ,  state ,  isBuf ,   chunk ,  encoding ,  cb ) ; 
248244  } 
249245
250246  return  ret ; 
@@ -293,11 +289,12 @@ function decodeChunk(state, chunk, encoding) {
293289// if we're already writing something, then just put this 
294290// in the queue, and wait our turn.  Otherwise, call _write 
295291// If we return false, then we need a drain event, so set that flag. 
296- function  writeOrBuffer ( stream ,  state ,  chunk ,  encoding ,  cb )  { 
297-   chunk  =  decodeChunk ( state ,  chunk ,  encoding ) ; 
298- 
299-   if  ( chunk  instanceof  Buffer ) 
300-     encoding  =  'buffer' ; 
292+ function  writeOrBuffer ( stream ,  state ,  isBuf ,  chunk ,  encoding ,  cb )  { 
293+   if  ( ! isBuf )  { 
294+     chunk  =  decodeChunk ( state ,  chunk ,  encoding ) ; 
295+     if  ( chunk  instanceof  Buffer ) 
296+       encoding  =  'buffer' ; 
297+   } 
301298  var  len  =  state . objectMode  ? 1  : chunk . length ; 
302299
303300  state . length  +=  len ; 
0 commit comments