Extremely fast utf8-only stream implementation to write to files and file descriptors.
This implementation is partial, but support backpressure and .pipe()
in is here.
However, it is 2-3x faster than Node Core fs.createWriteStream()
:
benchSonic*1000: 1916.904ms
benchSonicSync*1000: 8605.265ms
benchSonic4k*1000: 1965.231ms
benchSonicSync4k*1000: 1588.224ms
benchCore*1000: 5851.959ms
benchConsole*1000: 7605.713ms
Note that sync mode without buffering is slower than a Node Core WritableStream, however
this mode matches the expected behavior of console.log()
.
Note that if this is used to log to a windows terminal (cmd.exe
or
powershell), it is needed to run chcp 65001
in the terminal to
correctly display utf-8 characters, see
chcp for more details.
npm i sonic-boom
'use strict'
const SonicBoom = require('sonic-boom')
const sonic = new SonicBoom({ fd: process.stdout.fd }) // or { dest: '/path/to/destination' }
for (var i = 0; i < 10; i++) {
sonic.write('hello sonic\n')
}
Creates a new instance of SonicBoom.
The options are:
fd
: a file descriptor, something that is returned byfs.open
orfs.openSync
.dest
: a string that is a path to a file to be written to (mode'a'
).minLength
: the minimum lenght of the internal buffer that is required to be full before flushing.sync
: perform writes synchronously (similar toconsole.log
).
A SonicBoom
instance will emit the 'ready'
event when a file descriptor is available.
Writes the string to the file. It will return false to signal the producer to slow down.
Writes the current buffer to the file if a write was not in progress.
Do nothing if minLength
is zero or if it is already writing.
Reopen the file in place, useful for log rotation.
Example:
const stream = new SonicBoom('./my.log')
process.on('SIGUSR2', function () {
stream.reopen()
})
Flushes the buffered data synchronously. This is a costly operation.
Closes the stream, the data will be flushed down asynchronously
Closes the stream immediately, the data is not flushed.
MIT