Skip to content

BufferCollection can be indexed by using Proxy #6

@jordanbtucker

Description

@jordanbtucker

It is possible to provide indexing like Buffer has by using Proxy. Here's an example.

For more information, see Proxy and Reflect on MDN.

class BufferCollection {
  // Declare the index operator.
  [offset: number]: number

  // ...

  static from(
    values: BufferFromTypes | Buffer | BufferCollection,
    byteOffset?: number,
    length?: number,
  ): BufferCollection {
    const buf = new BufferCollection()
    if (values instanceof BufferCollection) {
      buf.push(values.toBuffer())
    } else if (values instanceof Buffer) {
      buf.push(values)
    } else if (
      values instanceof ArrayBuffer ||
      values instanceof SharedArrayBuffer
    ) {
      buf.push(Buffer.from(values, byteOffset, length))
    } else {
      buf.push(Buffer.from(values as any))
    }

    // Return a Proxy that traps the get and set index operators.
    return new Proxy(buf, {
      get(target, key) {
        // Ensure the key is a number.
        const offset = Number(key)
        if (!isNaN(offset)) {
          return target.get(offset)
        }

        // If key is not a number, default to the normal getter.
        return Reflect.get(target, key) as number
      },
      set(target, key, value): boolean {
        // Ensure the key is a number.
        const offset = Number(key)
        if (!isNaN(offset)) {
          target.set(offset, value)
          // Return true to indicate success.
          return true
        }

        // If key is not a number, default to the normal setter.
        return Reflect.set(target, key, value)
      },
    })
  }

  // ...
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions