Class Buffer

A 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.

import { Buffer } from "@std/io/buffer";
import { assertEquals } from "@std/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!");
Implements

Constructors

  • Constructs a new instance with the specified ArrayBuffer as its initial contents.

    Parameters

    • Optionalab: ArrayBufferLike | ArrayLike<number>

      The ArrayBuffer to use as the initial contents of the buffer.

    Returns Buffer

Accessors

  • get capacity(): number
  • The read only capacity of the buffer's underlying byte slice, that is, the total space allocated for the buffer's data.

    Returns number

    The capacity of the buffer.

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/assert/equals";

    const buf = new Buffer();
    assertEquals(buf.capacity, 0);
    await buf.write(new TextEncoder().encode("Hello, world!"));
    assertEquals(buf.capacity, 13);
  • get length(): number
  • A read only number of bytes of the unread portion of the buffer.

    Returns number

    The number of bytes of the unread portion of the buffer.

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/assert/equals";

    const buf = new Buffer();
    await buf.write(new TextEncoder().encode("Hello, world!"));

    assertEquals(buf.length, 13);

Methods

  • Returns 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.

    Parameters

    • options: {
          copy: boolean;
      } = ...

      The options for the slice.

      • copy: boolean

    Returns Uint8Array

    A slice holding the unread portion of the buffer.

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/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!");
  • Returns whether the unread portion of the buffer is empty.

    Returns boolean

    true if the unread portion of the buffer is empty, false otherwise.

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/assert/equals";

    const buf = new Buffer();
    assertEquals(buf.empty(), true);
    await buf.write(new TextEncoder().encode("Hello, world!"));
    assertEquals(buf.empty(), false);
  • Grows 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.

    Parameters

    • n: number

      The number of bytes to grow the buffer by.

    Returns void

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/assert/equals";

    const buf = new Buffer();
    buf.grow(10);
    assertEquals(buf.capacity, 10);
  • 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.

    Parameters

    • p: Uint8Array

      The buffer to read data into.

    Returns Promise<null | number>

    The number of bytes read.

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/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");
  • 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.

    Parameters

    • r: Reader

      The reader to read from.

    Returns Promise<number>

    The number of bytes read.

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/assert/equals";

    const buf = new Buffer();
    const r = new Buffer(new TextEncoder().encode("Hello, world!"));
    const n = await buf.readFrom(r);

    assertEquals(n, 13);
  • Reads 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.

    Parameters

    Returns number

    The number of bytes read.

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/assert/equals";

    const buf = new Buffer();
    const r = new Buffer(new TextEncoder().encode("Hello, world!"));
    const n = buf.readFromSync(r);

    assertEquals(n, 13);
  • Reads 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).

    Parameters

    • p: Uint8Array

      The buffer to read data into.

    Returns null | number

    The number of bytes read.

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/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");
  • Resets the contents

    Returns void

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/assert/equals";

    const buf = new Buffer();
    await buf.write(new TextEncoder().encode("Hello, world!"));
    buf.reset();
    assertEquals(buf.length, 0);
  • Discards 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.

    Parameters

    • n: number

      The number of bytes to keep.

    Returns void

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/assert/equals";

    const buf = new Buffer();
    await buf.write(new TextEncoder().encode("Hello, world!"));
    buf.truncate(6);
    assertEquals(buf.length, 6);
  • 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.

    Parameters

    • p: Uint8Array

      The data to write to the buffer.

    Returns Promise<number>

    The number of bytes written.

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/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!");
  • Writes the given data to the buffer.

    Parameters

    • p: Uint8Array

      The data to write to the buffer.

    Returns number

    The number of bytes written.

    import { Buffer } from "@std/io/buffer";
    import { assertEquals } from "@std/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!");