npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

unixio

v0.5.3

Published

File I/O in the sprit of C

Downloads

3

Readme

unixio

Asynchronous buffered I/O for Node in the Unix style.

const unixio = require("unixio");

Buffered I/O

try { fp = await unixio.fopen(name, mode); }

Opens a file for buffered character I/O in the manner of fopen. Note that the flags are parsed by fs.open, so they follow those conventions, not exactly those of stdio.

Note that there is a global reference to all Files that have not been closed, so that they can be flushed if necessary as the process is exiting.

fp = new unixio.File(stream);

Creates an I/O buffer for reads and writes to the specified stream (file descriptor, memory, pipe, or abstract, as described below).

unixio.stdin, unixio.stdout, unixio.stderr

Pre-opened streams for standard input, output, and error.

try { n = await fp.read(buffer, off, len); }

Reads up to len bytes into the specified Buffer, beginning at offset off.

try { n = await fp.write(buffer, off, len); }

Writes up to len bytes from the specified Buffer, beginning at offset off.

try { n = await fp.seek(off, whence); }

Flushes out any pending writes and seeks the file descriptor to the specified offset.

try { n = await fp.flush(); }

Flushes out any pending writes.

try { n = await fp.close(); }

Flushes out any pending writes; deregisters the buffer from the global stream list; closes the underlying stream.

try { b = await fp.getb(); }

Reads one byte from the stream, or returns unixio.EOF;

try { b = await fp.putb(b); }

Writes one byte to the stream.

try { b = await fp.ungetb(b); }

Puts a byte back into the buffer for the next getb.

try { b = await fp.peekb(); }

Returns the next byte to be read, but leaves it in the buffer for the next getb.

try { c = await fp.getc(); }

Reads one UTF-16 character from the stream, or returns unixio.EOF. If the character that is read is the first half of a surrogate pair, the next getc will return the second half.

try { c = await fp.putc(c); }

Writes one UTF-16 character to the stream. If you write the first half of a surrogate pair, it will be buffered until the second half is written.

try { c = await fp.ungetc(c); }

Puts a UTF-16 character back into the buffer for the next getc.

try { c = await fp.peekc(); }

Returns the next UTF-16 character to be read, but leaves it in the buffer for the next getc.

try { u = await fp.getu(); }

Reads one UTF-32 character from the stream, or returns unixio.EOF;

try { u = await fp.putu(u); }

Writes one UTF-32 character to the stream.

try { u = await fp.ungetu(u); }

Puts a UTF-32 character back into the buffer for the next getu.

try { u = await fp.peeku(); }

Returns the next UTF-32 character to be read, but leaves it in the buffer for the next getu.

try { s = await fp.gets(); }

Reads one \n-terminated line from the stream and returns it as a string, or null for EOF. For symmetry with puts, the \n is returned as part of the string.

try { n = await fp.puts(s); }

Writes the specified string to the stream.

try { s = await fp.getj(); }

Reads one JSON token from the stream and returns it as a string, or null for EOF. Note that strings are returned with their quotation marks in place.

Abstract I/O

Anything that implements the read, write, seek, flush, and close methods.

File descriptor I/O (unbuffered)

fdio = new unixio.Fdio(fd);

Creates a new file descriptor object referring to an already-open file descriptor.

try { fdio = await unixio.open(fname, mode [, perm]); }

Opens the named file in the manner of fs.open and creates a file descriptor referring to it.

try { n = await fdio.read(buffer, off, len); }

Reads up to len bytes into the specified Buffer, beginning at offset off.

try { n = await fdio.write(buffer, off, len); }

Writes up to len bytes from the specified Buffer, beginning at offset off.

try { n = await fdio.seek(off, whence); }

Seeks the file descriptor to the specified offset.

try { n = await fdio.flush(); }

A no-op, since file descriptor writes are unbuffered.

try { n = await fdio.close(); }

Closes the underlying file descriptor.

Memory I/O

w = new unixio.Memio();

Opens a stream to append to the end of a new buffer.

buf = w.buffer();

n = w.length();

s = w.toString();

r = new unixio.Memio(buf);

Opens a stream to read from the start of an existing Buffer.

In-process pipe

p = new unixio.Mempipe();

try { n = await p.to.write(buf, off, len); }

Puts data into the pipe. It is buffered until a reader is ready to consume it.

try { n = await p.to.close(); }

Closes the pipe for writing. Readers can consume the remaining data from the pipe, and then will receive EOF after no more is available.

try { n = await p.from.read(buf, off, len); }

Reads data from the pipe. If no data is available, the await does not resolve until data is available or the pipe has been closed.

try { n = await p.from.close(); }

Closes the pipe for reading. Any additional writes to the pipe will result in a broken pipe error.

Command line arguments

try { optind = await unixio.getopt(noargs, withargs); }

Parses command line arguments. noargs and withargs are maps from option names (like "-e" or "--verbose") to functions.

Options in noargs do not take arguments, and multiple short options may be combined in a single command line argument.

Options in withargs take an argument, which is either the text following a short argument, the next argument, or text following an = sign in a long argument. That is, the following will all work:

  • -etext
  • -e text
  • --expression=text
  • --expression text

An argument of - or -- ends argument processing, with - being left available as a filename argument, and -- being eliminated.

The return value from getopt is the index of the first element of process.argv that is a filename argument, not an option.

If an option specified in process.argv has no specified handler, or if there is no argument text for an option in withargs, it throws an Error.

Utility

try { await unixio.usleep(n) }

Sleeps for n microseconds by scheduling a Promise to resolve at that time. (Note that the sleep time is only accurate to one millisecond at best, since that is the unit that the underlying setTimeout uses.

unixio.call(f [, arg ...]);

Calls the named function, and calls the Promise that it returns with a then method that exits on error, as a convenience for calling into the first async function.

Constants

  • unixio.EOF = -1
  • unixio.SEEK_SET = 0
  • unixio.SEEK_CUR = 1
  • unixio.SEEK_END = 2
  • unixio.stdin = new unixio.File(new unixio.Fdio(0));
  • unixio.stdout = new unixio.File(new unixio.Fdio(1));
  • unixio.stderr = new unixio.File(new unixio.Fdio(2));