Skip to content

Commit

Permalink
fs: Add string encoding option for Stream method
Browse files Browse the repository at this point in the history
Add string encoding option for fs.createReadStream and
fs.createWriteStream. and check argument type more strictly

PR-URL: #1845
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
  • Loading branch information
yosuke-furukawa committed Jun 5, 2015
1 parent 59d9734 commit 353e26e
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 4 deletions.
6 changes: 4 additions & 2 deletions doc/api/fs.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -795,7 +795,7 @@ on Unix systems, it never was.

Returns a new ReadStream object (See `Readable Stream`).

`options` is an object with the following defaults:
`options` is an object or string with the following defaults:

{ flags: 'r',
encoding: null,
Expand All @@ -821,6 +821,7 @@ An example to read the last 10 bytes of a file which is 100 bytes long:

fs.createReadStream('sample.txt', {start: 90, end: 99});

If `options` is a string, then it specifies the encoding.

## Class: fs.ReadStream

Expand All @@ -837,7 +838,7 @@ Emitted when the ReadStream's file is opened.

Returns a new WriteStream object (See `Writable Stream`).

`options` is an object with the following defaults:
`options` is an object or string with the following defaults:

{ flags: 'w',
encoding: null,
Expand All @@ -854,6 +855,7 @@ Like `ReadStream` above, if `fd` is specified, `WriteStream` will ignore the
`path` argument and will use the specified file descriptor. This means that no
`open` event will be emitted.

If `options` is a string, then it specifies the encoding.

## Class: fs.WriteStream

Expand Down
18 changes: 16 additions & 2 deletions lib/fs.js
Original file line number Diff line number Diff line change
Expand Up @@ -1617,8 +1617,15 @@ function ReadStream(path, options) {
if (!(this instanceof ReadStream))
return new ReadStream(path, options);

if (options === undefined)
options = {};
else if (typeof options === 'string')
options = { encoding: options };
else if (options === null || typeof options !== 'object')
throw new TypeError('options must be a string or an object');

// a little bit bigger buffer and water marks by default
options = Object.create(options || {});
options = Object.create(options);
if (options.highWaterMark === undefined)
options.highWaterMark = 64 * 1024;

Expand Down Expand Up @@ -1783,7 +1790,14 @@ function WriteStream(path, options) {
if (!(this instanceof WriteStream))
return new WriteStream(path, options);

options = options || {};
if (options === undefined)
options = {};
else if (typeof options === 'string')
options = { encoding: options };
else if (options === null || typeof options !== 'object')
throw new TypeError('options must be a string or an object');

options = Object.create(options);

Writable.call(this, options);

Expand Down
17 changes: 17 additions & 0 deletions test/parallel/test-fs-read-stream-encoding.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const stream = require('stream');
const encoding = 'base64';

const example = path.join(common.fixturesDir, 'x.txt');
const assertStream = new stream.Writable({
write: function(chunk, enc, next) {
const expected = new Buffer('xyz');
assert(chunk.equals(expected));
}
});
assertStream.setDefaultEncoding(encoding);
fs.createReadStream(example, encoding).pipe(assertStream);
33 changes: 33 additions & 0 deletions test/parallel/test-fs-read-stream-throw-type-error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const fs = require('fs');
const path = require('path');

const example = path.join(common.fixturesDir, 'x.txt');

assert.doesNotThrow(function() {
fs.createReadStream(example, undefined);
});
assert.doesNotThrow(function() {
fs.createReadStream(example, 'utf8');
});
assert.doesNotThrow(function() {
fs.createReadStream(example, {encoding: 'utf8'});
});

assert.throws(function() {
fs.createReadStream(example, null);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createReadStream(example, 123);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createReadStream(example, 0);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createReadStream(example, true);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createReadStream(example, false);
}, /options must be a string or an object/);
33 changes: 33 additions & 0 deletions test/parallel/test-fs-write-stream-throw-type-error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const fs = require('fs');
const path = require('path');

const example = path.join(common.tmpDir, 'dummy');

assert.doesNotThrow(function() {
fs.createWriteStream(example, undefined);
});
assert.doesNotThrow(function() {
fs.createWriteStream(example, 'utf8');
});
assert.doesNotThrow(function() {
fs.createWriteStream(example, {encoding: 'utf8'});
});

assert.throws(function() {
fs.createWriteStream(example, null);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createWriteStream(example, 123);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createWriteStream(example, 0);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createWriteStream(example, true);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createWriteStream(example, false);
}, /options must be a string or an object/);

0 comments on commit 353e26e

Please sign in to comment.