Skip to main content
Deno 2 is finally here 🎉️
Learn more

shutdown_aware_transform_stream

A Deno module providing ShutdownAwareTransformStream: an augmented Web Streams TransformStream that enables Transformers holding resources requiring explicit cleanup to automatically perform cleanup steps when the stream either closes succesfully, or aborts with an error.

The standard TransformStream only informs its Transformer of the stream shutting down at end of input via the flush() method; it does not inform Transformers of the stream becoming aborted.

Usage

ShutdownAwareTransformStream is used like a regular TransformStream except that the Transformer can have an close() method that’s called once when the stream has closed at end of input, or has aborted due to an error.

Also controller.signal is an AbortSignal that triggers when the stream is aborted. (WritableStream Controllers also provide this, but standard TransformStreams do not.)

// from examples/simple.ts
import {
  ShutdownAwareTransformStream,
} from "https://deno.land/x/shutdown_aware_transform_stream@1.0.0/mod.ts";

const transform = new ShutdownAwareTransformStream<number, string>({
  transformer: {
    close() {
      console.log(`ShutdownAwareTransformer: close() called`);
    },
    transform(chunk, controller) {
      controller.enqueue(`transform(${chunk})`);
    },
    flush() {
      console.log(`ShutdownAwareTransformer: flush() called`);
    },
  },
});

someStream.pipeThrough(transform).pipeTo(otherStream);

The examples directory contains complete examples:.

$ deno run --quiet --import-map import_map.json examples/simple.ts
Using transform in a stream pipeline that ends with an error:
* dest: write(transform(1))
* dest: write(transform(2))
* dest: write(transform(3))
* dest: write(transform(4))
* dest: write(transform(5))
* dest: throwing error ...
ShutdownAwareTransformer: close() called
Pipeline failed: Error: error from dest


Using transform in a stream pipeline that ends normally:
* dest: write(transform(1))
* dest: write(transform(2))
* dest: write(transform(3))
* dest: write(transform(4))
* dest: write(transform(5))
ShutdownAwareTransformer: flush() called
ShutdownAwareTransformer: close() called
Pipeline completed normally

The module is available from deno.land:

import {
  ShutdownAwareTransformStream,
} from "https://deno.land/x/shutdown_aware_transform_stream@unpublished/mod.ts";
import type {
  ShutdownAwareTransformer,
  ShutdownAwareTransformStreamController,
  ShutdownAwareTransformStreamOptions,
} from "https://deno.land/x/shutdown_aware_transform_stream@unpublished/mod.ts";

Roadmap

  • Publish on deno.land

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

License

MIT