Q25: Build a Custom Stream Transform Pipeline Component

Create a data stream processor that processes stream chunks sequentially through composed async transform middleware, allowing chunks to be modified or filtered out.

Transform Stream Pipeline
class DataPipeline {
  constructor() {
    this.transforms = [];
  }

  use(transformFn) {
    this.transforms.push(transformFn);
    return this;
  }

  async execute(sourceDataStream) {
    const results = [];
    for (let chunk of sourceDataStream) {
      let currentData = chunk;
      let skipped = false;
      
      for (let transform of this.transforms) {
        currentData = await transform(currentData);
        if (currentData === null || currentData === undefined) {
          skipped = true;
          break;
        }
      }
      
      if (!skipped) {
        results.push(currentData);
      }
    }
    return results;
  }
}

const pipeline = new DataPipeline()
  .use(async x => x * 2)
  .use(async x => x > 5 ? x : null);

pipeline.execute([1, 2, 4]).then(console.log); // [8]
💡 Applies sequential transforms to each chunk. Returning null inside any transform halts the middleware chain and drops the chunk.
Key Takeaways
  • Pipes individual stream chunks through sequentially composed transformation middleware.
  • Supports filtering chunks from the stream when transform functions return null or undefined.
Knowledge Check

What happens when a transformation function in the pipeline returns null for a specific chunk?