Skip to content

Commit

Permalink
fs: add FileHandle.prototype.readLines
Browse files Browse the repository at this point in the history
  • Loading branch information
aduh95 committed Apr 29, 2022
1 parent 68fb0bf commit 8940ae2
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 0 deletions.
42 changes: 42 additions & 0 deletions doc/api/fs.md
Expand Up @@ -488,6 +488,46 @@ If one or more `filehandle.read()` calls are made on a file handle and then a
position till the end of the file. It doesn't always read from the beginning
of the file.
#### `filehandle.readLines([options])`
<!-- YAML
added: REPLACEME
-->
* `options` {Object}
* `encoding` {string} **Default:** `null`
* `autoClose` {boolean} **Default:** `true`
* `emitClose` {boolean} **Default:** `true`
* `start` {integer}
* `end` {integer} **Default:** `Infinity`
* `highWaterMark` {integer} **Default:** `64 * 1024`
* Returns: [`readlinePromises.Interface`][]
Convenient alias to create a `readline` interface and stream over the file. See
[`filehandle.createReadStream()`][] for the options.
```mjs
import { open } from 'node:fs/promises';

const file = await open('./some/file/to/read');

for await (const line of file.readLines()) {
console.log(line);
}
```
```cjs
const { open } = require('node:fs/promises');

(async () => {
const file = await open('./some/file/to/read');

for await (const line of file.readLines()) {
console.log(line);
}
})();
```
#### `filehandle.readv(buffers[, position])`
<!-- YAML
Expand Down Expand Up @@ -7493,6 +7533,7 @@ the file contents.
[`ReadDirectoryChangesW`]: https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-readdirectorychangesw
[`UV_THREADPOOL_SIZE`]: cli.md#uv_threadpool_sizesize
[`event ports`]: https://illumos.org/man/port_create
[`filehandle.createReadStream()`]: #filehandlecreatereadstreamoptions
[`filehandle.createWriteStream()`]: #filehandlecreatewritestreamoptions
[`filehandle.writeFile()`]: #filehandlewritefiledata-options
[`fs.access()`]: #fsaccesspath-mode-callback
Expand Down Expand Up @@ -7539,6 +7580,7 @@ the file contents.
[`fsPromises.utimes()`]: #fspromisesutimespath-atime-mtime
[`inotify(7)`]: https://man7.org/linux/man-pages/man7/inotify.7.html
[`kqueue(2)`]: https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
[`readlinePromises.Interface`]: readline.md#class-readlinepromisesinterface
[`util.promisify()`]: util.md#utilpromisifyoriginal
[bigints]: https://tc39.github.io/proposal-bigint
[caveats]: #caveats
Expand Down
8 changes: 8 additions & 0 deletions lib/internal/fs/promises.js
Expand Up @@ -96,6 +96,7 @@ const kUnref = Symbol('kUnref');
const kLocked = Symbol('kLocked');

const { kUsePromises } = binding;
const { Interface } = require('internal/readline/interface');
const {
JSTransferable, kDeserialize, kTransfer, kTransferList
} = require('internal/worker/js_transferable');
Expand Down Expand Up @@ -175,6 +176,13 @@ class FileHandle extends EventEmitterMixin(JSTransferable) {
return fsCall(readFile, this, options);
}

readLines(options = undefined) {
return new Interface({
input: this.createReadStream(options),
crlfDelay: Infinity,
});
}

stat(options) {
return fsCall(fstat, this, options);
}
Expand Down
3 changes: 3 additions & 0 deletions test/parallel/test-bootstrap-modules.js
Expand Up @@ -111,6 +111,9 @@ const expectedModules = new Set([
'NativeModule internal/process/warning',
'NativeModule internal/promise_hooks',
'NativeModule internal/querystring',
'NativeModule internal/readline/callbacks',
'NativeModule internal/readline/interface',
'NativeModule internal/readline/utils',
'NativeModule internal/socketaddress',
'NativeModule internal/source_map/source_map_cache',
'NativeModule internal/stream_base_commons',
Expand Down
40 changes: 40 additions & 0 deletions test/parallel/test-fs-promises-file-handle-readLines.mjs
@@ -0,0 +1,40 @@
import '../common/index.mjs';
import tmpdir from '../common/tmpdir.js';

import assert from 'node:assert';
import { open, writeFile } from 'node:fs/promises';
import path from 'node:path';

tmpdir.refresh();

const filePath = path.join(tmpdir.path, 'file.txt');

await writeFile(filePath, '1\n\n2\n');

let file;
try {
file = await open(filePath);

let i = 0;
for await (const line of file.readLines()) {
switch (i++) {
case 0:
assert.strictEqual(line, '1');
break;

case 1:
assert.strictEqual(line, '');
break;

case 2:
assert.strictEqual(line, '2');
break;

default:
assert.fail();
break;
}
}
} finally {
await file?.close();
}

0 comments on commit 8940ae2

Please sign in to comment.