stream: Make default encoding configurable
authorisaacs <i@izs.me>
Thu, 2 May 2013 19:25:50 +0000 (12:25 -0700)
committerisaacs <i@izs.me>
Tue, 14 May 2013 18:36:05 +0000 (11:36 -0700)
Pretty much everything assumes strings to be utf-8, but crypto
traditionally used binary strings, so we need to keep the default
that way until most users get off of that pattern.

lib/_stream_readable.js
lib/_stream_writable.js

index 34f714ce2cf75a23315d27e5bee808a2c77b2399..02c41510b4abd9a78b3215136019d16eaddb959e 100644 (file)
@@ -72,6 +72,11 @@ function ReadableState(options, stream) {
   // make all the buffer merging and length checks go away
   this.objectMode = !!options.objectMode;
 
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+
   // when piping, we only care about 'readable' events that happen
   // after read()ing all the bytes and not getting any pushback.
   this.ranOut = false;
@@ -112,7 +117,7 @@ Readable.prototype.push = function(chunk, encoding) {
   var state = this._readableState;
 
   if (typeof chunk === 'string' && !state.objectMode) {
-    encoding = encoding || 'utf8';
+    encoding = encoding || state.defaultEncoding;
     if (encoding !== state.encoding) {
       chunk = new Buffer(chunk, encoding);
       encoding = '';
index c060e015a05489878c8e4f83df7d0c24b14cd011..a26f711c1dafbb265da3ad7683b60babb1dc9037 100644 (file)
@@ -68,6 +68,11 @@ function WritableState(options, stream) {
   var noDecode = options.decodeStrings === false;
   this.decodeStrings = !noDecode;
 
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+
   // not an actual buffer we keep track of, but a measurement
   // of how much we're waiting to get pushed to some underlying
   // socket or file.
@@ -160,8 +165,11 @@ Writable.prototype.write = function(chunk, encoding, cb) {
     cb = encoding;
     encoding = null;
   }
-  if (!encoding)
-    encoding = 'utf8';
+
+  if (Buffer.isBuffer(chunk))
+    encoding = 'buffer';
+  else if (!encoding)
+    encoding = state.defaultEncoding;
 
   if (typeof cb !== 'function')
     cb = function() {};