NaturalCycles/nodejs-lib

View on GitHub
src/stream/transform/transformOffset.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
90%
import { Transform } from 'node:stream'
import { transformNoOp } from '../../index'
import { TransformOptions, TransformTyped } from '../stream.model'

export interface TransformOffsetOptions extends TransformOptions {
  /**
   * How many items to skip (offset) in the stream.
   *
   * Nullish value (e.g 0 or undefined) would mean "no offset".
   */
  offset?: number
}

export function transformOffset<IN>(opt: TransformOffsetOptions): TransformTyped<IN, IN> {
  const { offset } = opt

  if (!offset) {
    // No offset - returning pass-through transform
    return transformNoOp()
  }

  let i = 0 // so we start first chunk with 1
  return new Transform({
    objectMode: true,
    ...opt,
    transform(chunk: IN, _, cb) {
      if (++i <= offset) {
        return cb() // skip
      }

      cb(null, chunk)
    },
  })
}