<!DOCTYPE html><htmlclass="default"><head><metacharSet="utf-8"/><metahttp-equiv="x-ua-compatible"content="IE=edge"/><title>internal | play-dl</title><metaname="description"content="Documentation for play-dl"/><metaname="viewport"content="width=device-width, initial-scale=1"/><linkrel="stylesheet"href="../assets/style.css"/><linkrel="stylesheet"href="../assets/highlight.css"/><scriptasyncsrc="../assets/search.js"id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme")||"os")</script><header><divclass="tsd-page-toolbar"><divclass="container"><divclass="table-wrap"><divclass="table-cell"id="tsd-search"data-base=".."><divclass="field"><labelfor="tsd-search-field"class="tsd-widget search no-caption">Search</label><inputtype="text"id="tsd-search-field"/></div><ulclass="results"><liclass="state loading">Preparing search index...</li><liclass="state failure">The search index is not available</li></ul><ahref="../index.html"class="title">play-dl</a></div><divclass="table-cell"id="tsd-widgets"><divid="tsd-filter"><ahref="#"class="tsd-widget options no-caption"data-toggle="options">Options</a><divclass="tsd-filter-group"><divclass="tsd-select"id="tsd-filter-visibility"><spanclass="tsd-select-label">All</span><ulclass="tsd-select-list"><lidata-value="public">Public</li><lidata-value="protected">Public/Protected</li><lidata-value="private"class="selected">All</li></ul></div><inputtype="checkbox"id="tsd-filter-inherited"checked/><labelclass="tsd-widget"for="tsd-filter-inherited">Inherited</label><inputtype="checkbox"id="tsd-filter-externals"checked/><labelclass="tsd-widget"for="tsd-filter-externals">Externals</label></div></div><ahref="#"class="tsd-widget menu no-caption"data-toggle="menu">Menu</a></div></div></div></div><divclass="tsd-page-title"><divclass="container"><ulclass="tsd-breadcrumb"><li><ahref="../modules.html">play-dl</a></li><li><ahref="_internal_.html"><internal></a></li><li><ahref="_internal_.internal.html">internal</a></li></ul><h1>Namespace internal</h1></div></div></header><divclass="container container-main"><divclass="row"><divclass="col-8 col-content"><sectionclass="tsd-panel-group tsd-index-group"><h2>Index</h2><sectionclass="tsd-panel tsd-index-panel"><divclass="tsd-index-content"><sectionclass="tsd-index-section tsd-is-external"><h3>Namespaces</h3><ulclass="tsd-index-list"><liclass="tsd-kind-namespace tsd-parent-kind-namespace tsd-is-external"><ahref="_internal_.internal.finished.html"class="tsd-kind-icon">finished</a></li><liclass="tsd-kind-namespace tsd-parent-kind-namespace tsd-is-external"><ahref="_internal_.internal.pipeline.html"class="tsd-kind-icon">pipeline</a></li></ul></section><sectionclass="tsd-index-section tsd-is-external"><h3>Classes</h3><ulclass="tsd-index-list"><liclass="tsd-kind-class tsd-parent-kind-namespace tsd-is-external"><ahref="../classes/_internal_.internal.Duplex.html"class="tsd-kind-icon">Duplex</a></li><liclass="tsd-kind-class tsd-parent-kind-namespace tsd-is-external"><ahref="../classes/_internal_.internal.PassThrough.html"class="tsd-kind-icon">Pass<wbr/>Through</a></li><liclass="tsd-kind-class tsd-parent-kind-namespace tsd-is-external"><ahref="../classes/_internal_.internal.Readable.html"class="tsd-kind-icon">Readable</a></li><liclass="tsd-kind-class tsd-parent-kind-namespace tsd-is-external"><ahref="../classes/_internal_.internal.Stream.html"class="tsd-kind-icon">Stream</a></li><liclass="tsd-kind-class tsd-parent-kind-namespace tsd-is-external"><ahref="../classes/_internal_.internal.Transform.html"class="tsd-kind-icon">Transform</a></li><liclass="tsd-kind-class tsd-parent-kind-namespace tsd-is-external"><ahref="../classes/_internal_.internal.Writable.html"class="tsd-kind-icon">Writable</a></li></ul></section><sectionclass="tsd-index-section tsd-is-external"><h3>Interfaces</h3><ulclass="tsd-index-list"><liclass="tsd-kind-interface tsd-parent-kind-namespace tsd-is-external"><ahref="../interfaces/_internal_.internal.Du
<p>Attaches an AbortSignal to a readable or writeable stream. This lets code
control stream destruction using an <code>AbortController</code>.</p>
</div><div><p>Calling <code>abort</code> on the <code>AbortController</code> corresponding to the passed<code>AbortSignal</code> will behave the same way as calling <code>.destroy(new AbortError())</code>on the stream.</p>
<pre><codeclass="language-js"><spanclass="hl-2">const</span><spanclass="hl-0"></span><spanclass="hl-6">fs</span><spanclass="hl-0"> = </span><spanclass="hl-7">require</span><spanclass="hl-0">(</span><spanclass="hl-4">'fs'</span><spanclass="hl-0">);</span><br/><br/><spanclass="hl-2">const</span><spanclass="hl-0"></span><spanclass="hl-6">controller</span><spanclass="hl-0"> = </span><spanclass="hl-2">new</span><spanclass="hl-0"></span><spanclass="hl-7">AbortController</span><spanclass="hl-0">();</span><br/><spanclass="hl-2">const</span><spanclass="hl-0"></span><spanclass="hl-6">read</span><spanclass="hl-0"> = </span><spanclass="hl-7">addAbortSignal</span><spanclass="hl-0">(</span><br/><spanclass="hl-0"></span><spanclass="hl-3">controller</span><spanclass="hl-0">.</span><spanclass="hl-3">signal</span><spanclass="hl-0">,</span><br/><spanclass="hl-0"></span><spanclass="hl-3">fs</span><spanclass="hl-0">.</span><spanclass="hl-7">createReadStream</span><spanclass="hl-0">((</span><spanclass="hl-4">'object.json'</span><spanclass="hl-0">))</span><br/><spanclass="hl-0">);</span><br/><spanclass="hl-5">// Later, abort the operation closing the stream</span><br/><spanclass="hl-3">controller</span><spanclass="hl-0">.</span><spanclass="hl-7">abort</span><spanclass="hl-0">();</span>
</code></pre>
<p>Or using an <code>AbortSignal</code> with a readable stream as an async iterable:</p>
<pre><codeclass="language-js"><spanclass="hl-2">const</span><spanclass="hl-0"></span><spanclass="hl-6">controller</span><spanclass="hl-0"> = </span><spanclass="hl-2">new</span><spanclass="hl-0"></span><spanclass="hl-7">AbortController</span><spanclass="hl-0">();</span><br/><spanclass="hl-7">setTimeout</span><spanclass="hl-0">(() </span><spanclass="hl-2">=></span><spanclass="hl-0"></span><spanclass="hl-3">controller</span><spanclass="hl-0">.</span><spanclass="hl-7">abort</span><spanclass="hl-0">(), </span><spanclass="hl-8">10_000</span><spanclass="hl-0">); </span><spanclass="hl-5">// set a timeout</span><br/><spanclass="hl-2">const</span><spanclass="hl-0"></span><spanclass="hl-6">stream</span><spanclass="hl-0"> = </span><spanclass="hl-7">addAbortSignal</span><spanclass="hl-0">(</span><br/><spanclass="hl-0"></span><spanclass="hl-3">controller</span><spanclass="hl-0">.</span><spanclass="hl-3">signal</span><spanclass="hl-0">,</span><br/><spanclass="hl-0"></span><spanclass="hl-3">fs</span><spanclass="hl-0">.</span><spanclass="hl-7">createReadStream</span><spanclass="hl-0">((</span><spanclass="hl-4">'object.json'</span><spanclass="hl-0">))</span><br/><spanclass="hl-0">);</span><br/><spanclass="hl-0">(</span><spanclass="hl-2">async</span><spanclass="hl-0"> () </span><spanclass="hl-2">=></span><spanclass="hl-0"> {</span><br/><spanclass="hl-0"></span><spanclass="hl-1">try</span><spanclass="hl-0"> {</span><br/><spanclass="hl-0"></span><spanclass="hl-1">for</span><spanclass="hl-0"></span><spanclass="hl-1">await</span><spanclass="hl-0"> (</span><spanclass="hl-2">const</span><spanclass="hl-0"></span><spanclass="hl-6">chunk</span><spanclass="hl-0"></span><spanclass="hl-2">of</span><spanclass="hl-0"></span><spanclass="hl-3">stream</span><spanclass="hl-0">) {</span><br/><spanclass="hl-0"></span><spanclass="hl-1">await</span><spanclass="hl-0"></span><spanclass="hl-7">process</span><spanclass="hl-0">(</span><spanclass="hl-3">chunk</span><spanclass="hl-0">);</span><br/><spanclass="hl-0"> }</span><br/><spanclass="hl-0"> } </span><spanclass="hl-1">catch</span><spanclass="hl-0"> (</span><spanclass="hl-3">e</span><spanclass="hl-0">) {</span><br/><spanclass="hl-0"></span><spanclass="hl-1">if</span><spanclass="hl-0"> (</span><spanclass="hl-3">e</span><spanclass="hl-0">.</span><spanclass="hl-3">name</span><spanclass="hl-0"> === </span><spanclass="hl-4">'AbortError'</span><spanclass="hl-0">) {</span><br/><spanclass="hl-0"></span><spanclass="hl-5">// The operation was cancelled</span><br/><spanclass="hl-0"> } </span><spanclass="hl-1">else</span><spanclass="hl-0"> {</span><br/><spanclass="hl-0"></span><spanclass="hl-1">throw</span><spanclass="hl-0"></span><spanclass="hl-3">e</span><spanclass="hl-0">;</span><br/><spanclass="hl-0"> }</span><br/><spanclass="hl-0"> }</span><br/><spanclass="hl-0">})();</span>
<p>Especially useful in error handling scenarios where a stream is destroyed
prematurely (like an aborted HTTP request), and will not emit <code>'end'</code>or <code>'finish'</code>.</p>
<p>The <code>finished</code> API provides promise version:</p>
<pre><codeclass="language-js"><spanclass="hl-2">const</span><spanclass="hl-0"> { </span><spanclass="hl-6">finished</span><spanclass="hl-0"> } = </span><spanclass="hl-7">require</span><spanclass="hl-0">(</span><spanclass="hl-4">'stream/promises'</span><spanclass="hl-0">);</span><br/><br/><spanclass="hl-2">const</span><spanclass="hl-0"></span><spanclass="hl-6">rs</span><spanclass="hl-0"> = </span><spanclass="hl-3">fs</span><spanclass="hl-0">.</span><spanclass="hl-7">createReadStream</span><spanclass="hl-0">(</span><spanclass="hl-4">'archive.tar'</span><spanclass="hl-0">);</span><br/><br/><spanclass="hl-2">async</span><spanclass="hl-0"></span><spanclass="hl-2">function</span><spanclass="hl-0"></span><spanclass="hl-7">run</span><spanclass="hl-0">() {</span><br/><spanclass="hl-0"></span><spanclass="hl-1">await</span><spanclass="hl-0"></span><spanclass="hl-7">finished</span><spanclass="hl-0">(</span><spanclass="hl-3">rs</span><spanclass="hl-0">);</span><br/><spanclass="hl-0"></span><spanclass="hl-3">console</span><spanclass="hl-0">.</span><spanclass="hl-7">log</span><spanclass="hl-0">(</span><spanclass="hl-4">'Stream is done reading.'</span><spanclass="hl-0">);</span><br/><spanclass="hl-0">}</span><br/><br/><spanclass="hl-7">run</span><spanclass="hl-0">().</span><spanclass="hl-7">catch</span><spanclass="hl-0">(</span><spanclass="hl-3">console</span><spanclass="hl-0">.</span><spanclass="hl-3">error</span><spanclass="hl-0">);</span><br/><spanclass="hl-3">rs</span><spanclass="hl-0">.</span><spanclass="hl-7">resume</span><spanclass="hl-0">(); </span><spanclass="hl-5">// Drain the stream.</span>
</code></pre>
<p><code>stream.finished()</code> leaves dangling event listeners (in particular<code>'error'</code>, <code>'end'</code>, <code>'finish'</code> and <code>'close'</code>) after <code>callback</code> has been
invoked. The reason for this is so that unexpected <code>'error'</code> events (due to
incorrect stream implementations) do not cause unexpected crashes.
If this is unwanted behavior then the returned cleanup function needs to be
<p>Especially useful in error handling scenarios where a stream is destroyed
prematurely (like an aborted HTTP request), and will not emit <code>'end'</code>or <code>'finish'</code>.</p>
<p>The <code>finished</code> API provides promise version:</p>
<pre><codeclass="language-js"><spanclass="hl-2">const</span><spanclass="hl-0"> { </span><spanclass="hl-6">finished</span><spanclass="hl-0"> } = </span><spanclass="hl-7">require</span><spanclass="hl-0">(</span><spanclass="hl-4">'stream/promises'</span><spanclass="hl-0">);</span><br/><br/><spanclass="hl-2">const</span><spanclass="hl-0"></span><spanclass="hl-6">rs</span><spanclass="hl-0"> = </span><spanclass="hl-3">fs</span><spanclass="hl-0">.</span><spanclass="hl-7">createReadStream</span><spanclass="hl-0">(</span><spanclass="hl-4">'archive.tar'</span><spanclass="hl-0">);</span><br/><br/><spanclass="hl-2">async</span><spanclass="hl-0"></span><spanclass="hl-2">function</span><spanclass="hl-0"></span><spanclass="hl-7">run</span><spanclass="hl-0">() {</span><br/><spanclass="hl-0"></span><spanclass="hl-1">await</span><spanclass="hl-0"></span><spanclass="hl-7">finished</span><spanclass="hl-0">(</span><spanclass="hl-3">rs</span><spanclass="hl-0">);</span><br/><spanclass="hl-0"></span><spanclass="hl-3">console</span><spanclass="hl-0">.</span><spanclass="hl-7">log</span><spanclass="hl-0">(</span><spanclass="hl-4">'Stream is done reading.'</span><spanclass="hl-0">);</span><br/><spanclass="hl-0">}</span><br/><br/><spanclass="hl-7">run</span><spanclass="hl-0">().</span><spanclass="hl-7">catch</span><spanclass="hl-0">(</span><spanclass="hl-3">console</span><spanclass="hl-0">.</span><spanclass="hl-3">error</span><spanclass="hl-0">);</span><br/><spanclass="hl-3">rs</span><spanclass="hl-0">.</span><spanclass="hl-7">resume</span><spanclass="hl-0">(); </span><spanclass="hl-5">// Drain the stream.</span>
</code></pre>
<p><code>stream.finished()</code> leaves dangling event listeners (in particular<code>'error'</code>, <code>'end'</code>, <code>'finish'</code> and <code>'close'</code>) after <code>callback</code> has been
invoked. The reason for this is so that unexpected <code>'error'</code> events (due to
incorrect stream implementations) do not cause unexpected crashes.
If this is unwanted behavior then the returned cleanup function needs to be
</dd></dl></div><h4class="tsd-returns-title">Returns <spanclass="tsd-signature-type">void</span></h4><div><p>A cleanup function which removes all registered listeners.</p>
<p>A module method to pipe between streams and generators forwarding errors and
properly cleaning up and provide a callback when the pipeline is complete.</p>
</div><div><pre><codeclass="language-js"><spanclass="hl-2">const</span><spanclass="hl-0"> { </span><spanclass="hl-6">pipeline</span><spanclass="hl-0"> } = </span><spanclass="hl-7">require</span><spanclass="hl-0">(</span><spanclass="hl-4">'stream'</span><spanclass="hl-0">);</span><br/><spanclass="hl-2">const</span><spanclass="hl-0"></span><spanclass="hl-6">fs</span><spanclass="hl-0"> = </span><spanclass="hl-7">require</span><spanclass="hl-0">(</span><spanclass="hl-4">'fs'</span><spanclass="hl-0">);</span><br/><spanclass="hl-2">const</span><spanclass="hl-0"></span><spanclass="hl-6">zlib</span><spanclass="hl-0"> = </span><spanclass="hl-7">require</span><spanclass="hl-0">(</span><spanclass="hl-4">'zlib'</span><spanclass="hl-0">);</span><br/><br/><spanclass="hl-5">// Use the pipeline API to easily pipe a series of streams</span><br/><spanclass="hl-5">// together and get notified when the pipeline is fully done.</span><br/><br/><spanclass="hl-5">// A pipeline to gzip a potentially huge tar file efficiently:</span><br/><br/><spanclass="hl-7">pipeline</span><spanclass="hl-0">(</span><br/><spanclass="hl-0"></span><spanclass="hl-3">fs</span><spanclass="hl-0">.</span><spanclass="hl-7">createReadStream</span><spanclass="hl-0">(</span><spanclass="hl-4">'archive.tar'</span><spanclass="hl-0">),</span><br/><spanclass="hl-0"></span><spanclass="hl-3">zlib</span><spanclass="hl-0">.</span><spanclass="hl-7">createGzip</span><spanclass="hl-0">(),</span><br/><spanclass="hl-0"></span><spanclass="hl-3">fs</span><spanclass="hl-0">.</span><spanclass="hl-7">createWriteStream</span><spanclass="hl-0">(</span><spanclass="hl-4">'archive.tar.gz'</span><spanclass="hl-0">),</span><br/><spanclass="hl-0"> (</span><spanclass="hl-3">err</span><spanclass="hl-0">) </span><spanclass="hl-2">=></span><spanclass="hl-0"> {</span><br/><spanclass="hl-0"></span><spanclass="hl-1">if</span><spanclass="hl-0"> (</span><spanclass="hl-3">err</span><spanclass="hl-0">) {</span><br/><spanclass="hl-0"></span><spanclass="hl-3">console</span><spanclass="hl-0">.</span><spanclass="hl-7">error</span><spanclass="hl-0">(</span><spanclass="hl-4">'Pipeline failed.'</span><spanclass="hl-0">, </span><spanclass="hl-3">err</span><spanclass="hl-0">);</span><br/><spanclass="hl-0"> } </span><spanclass="hl-1">else</span><spanclass="hl-0"> {</span><br/><spanclass="hl-0"></span><spanclass="hl-3">console</span><spanclass="hl-0">.</span><spanclass="hl-7">log</span><spanclass="hl-0">(</span><spanclass="hl-4">'Pipeline succeeded.'</span><spanclass="hl-0">);</span><br/><spanclass="hl-0"> }</span><br/><spanclass="hl-0"> }</span><br/><spanclass="hl-0">);</span>
</code></pre>
<p>The <code>pipeline</code> API provides a promise version, which can also
receive an options argument as the last parameter with a<code>signal</code><code>AbortSignal</code> property. When the signal is aborted,<code>destroy</code> will be called on the underlying pipeline, with