Buffer
import { Buffer } from "jsr:@ende/io";class
class Buffer implements Writer, WriterSync, Reader, ReaderSyncA variable-sized buffer of bytes with read() and write() methods.
Buffer is almost always used with some I/O like files and sockets. It allows one to buffer up a download from a socket. Buffer grows and shrinks as necessary.
Buffer is NOT the same thing as Node's Buffer. Node's Buffer was created in 2009 before JavaScript had the concept of ArrayBuffers. It's simply a non-standard ArrayBuffer.
ArrayBuffer is a fixed memory allocation. Buffer is implemented on top of ArrayBuffer.
Based on Go Buffer.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
await buf.write(new TextEncoder().encode("Hello, "));
await buf.write(new TextEncoder().encode("world!"));
const data = new Uint8Array(13);
await buf.read(data);
assertEquals(new TextDecoder().decode(data), "Hello, world!");
Constructors
constructor
new Buffer(ab?: ArrayBufferLike | ArrayLike<number>)Constructs a new instance with the specified ArrayBuffer as its
initial contents.
ab?: ArrayBufferLike | ArrayLike<number>The ArrayBuffer to use as the initial contents of the buffer.
Methods
bytes
bytes(options: { copy: boolean } = [UNSUPPORTED]): Uint8ArrayReturns a slice holding the unread portion of the buffer.
The slice is valid for use only until the next buffer modification (that
is, only until the next call to a method like read(), write(),
reset(), or truncate()). If options.copy is false the slice aliases the buffer content at
least until the next buffer modification, so immediate changes to the
slice will affect the result of future reads.
options: { copy: boolean } = [UNSUPPORTED]The options for the slice.
Returns
A slice holding the unread portion of the buffer.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
await buf.write(new TextEncoder().encode("Hello, world!"));
const slice = buf.bytes();
assertEquals(new TextDecoder().decode(slice), "Hello, world!");
empty
empty(): booleanReturns whether the unread portion of the buffer is empty.
Returns
true if the unread portion of the buffer is empty, false
otherwise.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
assertEquals(buf.empty(), true);
await buf.write(new TextEncoder().encode("Hello, world!"));
assertEquals(buf.empty(), false);
length
get length(): numberA read only number of bytes of the unread portion of the buffer.
Returns
The number of bytes of the unread portion of the buffer.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
await buf.write(new TextEncoder().encode("Hello, world!"));
assertEquals(buf.length, 13);
capacity
get capacity(): numberThe read only capacity of the buffer's underlying byte slice, that is, the total space allocated for the buffer's data.
Returns
The capacity of the buffer.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
assertEquals(buf.capacity, 0);
await buf.write(new TextEncoder().encode("Hello, world!"));
assertEquals(buf.capacity, 13);
truncate
truncate(n: number): voidDiscards all but the first n unread bytes from the buffer but
continues to use the same allocated storage. It throws if n is
negative or greater than the length of the buffer.
n: numberThe number of bytes to keep.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
await buf.write(new TextEncoder().encode("Hello, world!"));
buf.truncate(6);
assertEquals(buf.length, 6);
reset
reset(): voidResets the contents
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
await buf.write(new TextEncoder().encode("Hello, world!"));
buf.reset();
assertEquals(buf.length, 0);
readSync
readSync(p: Uint8Array): number | nullReads the next p.length bytes from the buffer or until the buffer is
drained. Returns the number of bytes read. If the buffer has no data to
return, the return is EOF (null).
p: Uint8ArrayThe buffer to read data into.
Returns
The number of bytes read.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
await buf.write(new TextEncoder().encode("Hello, world!"));
const data = new Uint8Array(5);
const res = await buf.read(data);
assertEquals(res, 5);
assertEquals(new TextDecoder().decode(data), "Hello");
read
read(p: Uint8Array): Promise<number | null>Reads the next p.length bytes from the buffer or until the buffer is
drained. Resolves to the number of bytes read. If the buffer has no
data to return, resolves to EOF (null).
NOTE: This methods reads bytes synchronously; it's provided for
compatibility with Reader interfaces.
p: Uint8ArrayThe buffer to read data into.
Returns
The number of bytes read.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
await buf.write(new TextEncoder().encode("Hello, world!"));
const data = new Uint8Array(5);
const res = await buf.read(data);
assertEquals(res, 5);
assertEquals(new TextDecoder().decode(data), "Hello");
writeSync
writeSync(p: Uint8Array): numberWrites the given data to the buffer.
p: Uint8ArrayThe data to write to the buffer.
Returns
The number of bytes written.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
const data = new TextEncoder().encode("Hello, world!");
buf.writeSync(data);
const slice = buf.bytes();
assertEquals(new TextDecoder().decode(slice), "Hello, world!");
write
write(p: Uint8Array): Promise<number>Writes the given data to the buffer. Resolves to the number of bytes written.
Note
This methods writes bytes synchronously; it's provided for compatibility
with the Writer interface.
p: Uint8ArrayThe data to write to the buffer.
Returns
The number of bytes written.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
const data = new TextEncoder().encode("Hello, world!");
await buf.write(data);
const slice = buf.bytes();
assertEquals(new TextDecoder().decode(slice), "Hello, world!");
grow
grow(n: number): voidGrows the buffer's capacity, if necessary, to guarantee space for
another n bytes. After .grow(n), at least n bytes can be written to
the buffer without another allocation. If n is negative, .grow() will
throw. If the buffer can't grow it will throw an error.
Based on Go Lang's Buffer.Grow.
n: numberThe number of bytes to grow the buffer by.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
buf.grow(10);
assertEquals(buf.capacity, 10);
readFrom
readFrom(r: Reader): Promise<number>Reads data from r until EOF (null) and appends it to the buffer,
growing the buffer as needed. It resolves to the number of bytes read.
If the buffer becomes too large, .readFrom() will reject with an error.
Based on Go Lang's Buffer.ReadFrom.
r: ReaderThe reader to read from.
Returns
The number of bytes read.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
const r = new Buffer(new TextEncoder().encode("Hello, world!"));
const n = await buf.readFrom(r);
assertEquals(n, 13);
readFromSync
readFromSync(r: ReaderSync): numberReads data from r until EOF (null) and appends it to the buffer,
growing the buffer as needed. It returns the number of bytes read. If the
buffer becomes too large, .readFromSync() will throw an error.
Based on Go Lang's Buffer.ReadFrom.
r: ReaderSyncThe reader to read from.
Returns
The number of bytes read.
Example: Usage
import { Buffer } from "@ende/io/buffer";
import { assertEquals } from "@ende/assert/equals";
const buf = new Buffer();
const r = new Buffer(new TextEncoder().encode("Hello, world!"));
const n = buf.readFromSync(r);
assertEquals(n, 13);