<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Socket on Grafana Labs</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/</link><description>Recent content in Socket on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/index.xml" rel="self" type="application/rss+xml"/><item><title>Socket.connect( port, [host] )</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/connect/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/connect/</guid><content><![CDATA[&lt;h1 id=&#34;socketconnect&#34;&gt;Socket.connect()&lt;/h1&gt;
&lt;p&gt;Asynchronously establishes a TCP connection to a remote server. Returns a Promise that resolves when the connection is established, or rejects on failure.&lt;/p&gt;
&lt;h2 id=&#34;signature&#34;&gt;Signature&lt;/h2&gt;
&lt;!-- md-k6:skipall --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;// Overload 1: port and optional host
socket.connect(port, host)

// Overload 2: options object
socket.connect(options)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Overload 1&lt;/strong&gt;&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Parameter&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;port&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;number | string&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Destination port (1-65535)&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;host&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;string&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Destination hostname or IP address. Defaults to &lt;code&gt;&#39;localhost&#39;&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;&lt;strong&gt;Overload 2&lt;/strong&gt;&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Parameter&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;options.port&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;number | string&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Destination port (required)&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;options.host&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;string&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Destination hostname or IP address. Defaults to &lt;code&gt;&#39;localhost&#39;&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;options.tls&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;boolean&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Enable TLS/SSL encryption. Defaults to &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;options.tags&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;object&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Custom tags for connection metrics (key-value pairs)&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Promise&amp;lt;void&amp;gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Resolves when the connection is established. Rejects on connection failure&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;tlsssl-configuration&#34;&gt;TLS/SSL configuration&lt;/h2&gt;
&lt;p&gt;When &lt;code&gt;tls: true&lt;/code&gt; is set, the socket performs a TLS handshake after establishing the TCP connection. TLS settings such as certificates, verification, and cipher suites are controlled by k6&amp;rsquo;s standard 
    &lt;a href=&#34;/docs/k6/v2.3.x/using-k6/protocols/ssl-tls/&#34;&gt;TLS configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { Socket } from &amp;#34;k6/x/tcp&amp;#34;

export default async function () {
  // Overload 1: connect with separate port and host
  const socket = new Socket()
  const closed = new Promise((resolve) =&amp;gt; { socket.on(&amp;#34;close&amp;#34;, resolve) })
  socket.on(&amp;#34;error&amp;#34;, (err) =&amp;gt; { console.error(&amp;#34;Error:&amp;#34;, err) })

  await socket.connect(8080, &amp;#34;example.com&amp;#34;)
  console.log(&amp;#34;Connected&amp;#34;)
  socket.destroy()
  await closed

  // Overload 2: connect with options object and TLS
  const tlsSocket = new Socket({ tags: { protocol: &amp;#34;tls&amp;#34; } })
  const tlsClosed = new Promise((resolve) =&amp;gt; { tlsSocket.on(&amp;#34;close&amp;#34;, resolve) })
  tlsSocket.on(&amp;#34;error&amp;#34;, (err) =&amp;gt; { console.error(&amp;#34;TLS error:&amp;#34;, err) })

  await tlsSocket.connect({
    port: 443,
    host: &amp;#34;secure.example.com&amp;#34;,
    tls: true,
  })
  console.log(&amp;#34;TLS connection established&amp;#34;)
  tlsSocket.destroy()
  await tlsClosed
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="socketconnect">Socket.connect()&lt;/h1>
&lt;p>Asynchronously establishes a TCP connection to a remote server. Returns a Promise that resolves when the connection is established, or rejects on failure.&lt;/p>
&lt;h2 id="signature">Signature&lt;/h2>
&lt;!-- md-k6:skipall -->
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">// Overload 1: port and optional host
socket.connect(port, host)
// Overload 2: options object
socket.connect(options)&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;h2 id="parameters">Parameters&lt;/h2>
&lt;p>&lt;strong>Overload 1&lt;/strong>&lt;/p></description></item><item><title>Socket.write( data, [options] )</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/write/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/write/</guid><content><![CDATA[&lt;h1 id=&#34;socketwrite&#34;&gt;Socket.write()&lt;/h1&gt;
&lt;p&gt;Asynchronously sends data to the remote server. Returns a Promise that resolves when the data has been written to the socket.&lt;/p&gt;
&lt;h2 id=&#34;signature&#34;&gt;Signature&lt;/h2&gt;
&lt;!-- md-k6:skipall --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;socket.write(data, options)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Parameter&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;data&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;string | ArrayBuffer&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Data to send. Use &lt;code&gt;ArrayBuffer&lt;/code&gt; for binary data&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;options&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;object&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Optional write configuration&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;options.encoding&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;string&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Encoding for string data: &lt;code&gt;utf8&lt;/code&gt; / &lt;code&gt;utf-8&lt;/code&gt; (default), &lt;code&gt;ascii&lt;/code&gt;, &lt;code&gt;base64&lt;/code&gt;, &lt;code&gt;base64url&lt;/code&gt;, &lt;code&gt;hex&lt;/code&gt;. Ignored when &lt;code&gt;data&lt;/code&gt; is an &lt;code&gt;ArrayBuffer&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;options.tags&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;object&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Custom tags for this write operation&amp;rsquo;s metrics (key-value pairs)&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Promise&amp;lt;void&amp;gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Resolves when the data has been written to the socket&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { Socket } from &amp;#34;k6/x/tcp&amp;#34;

export default async function () {
  const socket = new Socket()
  const closed = new Promise((resolve) =&amp;gt; { socket.on(&amp;#34;close&amp;#34;, resolve) })
  socket.on(&amp;#34;error&amp;#34;, (err) =&amp;gt; { console.error(&amp;#34;Error:&amp;#34;, err) })

  await socket.connect(8080, &amp;#34;example.com&amp;#34;)

  // Write a plain text string (utf8 by default)
  await socket.write(&amp;#34;Hello, server!&amp;#34;)

  // Write base64-encoded data
  await socket.write(&amp;#34;SGVsbG8gV29ybGQ=&amp;#34;, { encoding: &amp;#34;base64&amp;#34; })

  // Write with custom tags for metrics
  await socket.write(&amp;#34;request payload&amp;#34;, {
    tags: { operation: &amp;#34;auth-request&amp;#34; },
  })

  socket.destroy()
  await closed
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="socketwrite">Socket.write()&lt;/h1>
&lt;p>Asynchronously sends data to the remote server. Returns a Promise that resolves when the data has been written to the socket.&lt;/p>
&lt;h2 id="signature">Signature&lt;/h2>
&lt;!-- md-k6:skipall -->
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">socket.write(data, options)&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;h2 id="parameters">Parameters&lt;/h2>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">Parameter&lt;/th>
&lt;th style="text-align: left">Type&lt;/th>
&lt;th style="text-align: left">Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">data&lt;/td>
&lt;td style="text-align: left">string | ArrayBuffer&lt;/td>
&lt;td style="text-align: left">Data to send. Use &lt;code>ArrayBuffer&lt;/code> for binary data&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">options&lt;/td>
&lt;td style="text-align: left">object&lt;/td>
&lt;td style="text-align: left">Optional write configuration&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">options.encoding&lt;/td>
&lt;td style="text-align: left">string&lt;/td>
&lt;td style="text-align: left">Encoding for string data: &lt;code>utf8&lt;/code> / &lt;code>utf-8&lt;/code> (default), &lt;code>ascii&lt;/code>, &lt;code>base64&lt;/code>, &lt;code>base64url&lt;/code>, &lt;code>hex&lt;/code>. Ignored when &lt;code>data&lt;/code> is an &lt;code>ArrayBuffer&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">options.tags&lt;/td>
&lt;td style="text-align: left">object&lt;/td>
&lt;td style="text-align: left">Custom tags for this write operation&amp;rsquo;s metrics (key-value pairs)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h2 id="returns">Returns&lt;/h2>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">Type&lt;/th>
&lt;th style="text-align: left">Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">Promise&amp;lt;void&amp;gt;&lt;/td>
&lt;td style="text-align: left">Resolves when the data has been written to the socket&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h2 id="example">Example&lt;/h2>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { Socket } from &amp;#34;k6/x/tcp&amp;#34;
export default async function () {
const socket = new Socket()
const closed = new Promise((resolve) =&amp;gt; { socket.on(&amp;#34;close&amp;#34;, resolve) })
socket.on(&amp;#34;error&amp;#34;, (err) =&amp;gt; { console.error(&amp;#34;Error:&amp;#34;, err) })
await socket.connect(8080, &amp;#34;example.com&amp;#34;)
// Write a plain text string (utf8 by default)
await socket.write(&amp;#34;Hello, server!&amp;#34;)
// Write base64-encoded data
await socket.write(&amp;#34;SGVsbG8gV29ybGQ=&amp;#34;, { encoding: &amp;#34;base64&amp;#34; })
// Write with custom tags for metrics
await socket.write(&amp;#34;request payload&amp;#34;, {
tags: { operation: &amp;#34;auth-request&amp;#34; },
})
socket.destroy()
await closed
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>Socket.destroy()</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/destroy/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/destroy/</guid><content><![CDATA[&lt;h1 id=&#34;socketdestroy&#34;&gt;Socket.destroy()&lt;/h1&gt;
&lt;p&gt;Closes the connection and destroys the socket. After you call &lt;code&gt;destroy()&lt;/code&gt;, the socket transitions to the &lt;code&gt;&#39;destroyed&#39;&lt;/code&gt; state, and you can&amp;rsquo;t reuse it. A &lt;code&gt;close&lt;/code&gt; event is emitted after the socket is destroyed.&lt;/p&gt;
&lt;h2 id=&#34;signature&#34;&gt;Signature&lt;/h2&gt;
&lt;!-- md-k6:skipall --&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;socket.destroy();&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;void&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { Socket } from &amp;#39;k6/x/tcp&amp;#39;;

export default async function () {
  const socket = new Socket();

  const closed = new Promise((resolve) =&amp;gt; {
    socket.on(&amp;#39;close&amp;#39;, () =&amp;gt; {
      console.log(&amp;#39;Connection closed&amp;#39;);
      resolve();
    });
  });

  socket.on(&amp;#39;data&amp;#39;, (data) =&amp;gt; {
    const str = new TextDecoder().decode(data);
    console.log(&amp;#39;Received:&amp;#39;, str);
    socket.destroy();
  });

  socket.on(&amp;#39;error&amp;#39;, (err) =&amp;gt; {
    console.error(&amp;#39;Error:&amp;#39;, err);
    socket.destroy();
  });

  const host = __ENV.TCP_HOST || &amp;#39;localhost&amp;#39;;
  const port = __ENV.TCP_PORT || &amp;#39;8080&amp;#39;;

  await socket.connect(port, host);
  await socket.write(&amp;#39;Hello, server!&amp;#39;);

  await closed;
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="socketdestroy">Socket.destroy()&lt;/h1>
&lt;p>Closes the connection and destroys the socket. After you call &lt;code>destroy()&lt;/code>, the socket transitions to the &lt;code>'destroyed'&lt;/code> state, and you can&amp;rsquo;t reuse it. A &lt;code>close&lt;/code> event is emitted after the socket is destroyed.&lt;/p></description></item><item><title>Socket.setTimeout( timeout )</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/set-timeout/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/set-timeout/</guid><content><![CDATA[&lt;h1 id=&#34;socketsettimeout&#34;&gt;Socket.setTimeout()&lt;/h1&gt;
&lt;p&gt;Sets the inactivity timeout for the socket. When the socket has been idle for &lt;code&gt;timeout&lt;/code&gt; milliseconds without receiving data, a &lt;code&gt;timeout&lt;/code&gt; event is emitted.&lt;/p&gt;
&lt;p&gt;The socket &lt;em&gt;doesn&amp;rsquo;t automatically close&lt;/em&gt; after a timeout. The connection remains open until you explicitly call &lt;code&gt;destroy()&lt;/code&gt;. To disable a previously set timeout, pass &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;signature&#34;&gt;Signature&lt;/h2&gt;
&lt;!-- md-k6:skipall --&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;socket.setTimeout(timeout);&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Parameter&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;timeout&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;number&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Inactivity timeout in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Socket&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The socket instance, for method chaining&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { Socket } from &amp;#39;k6/x/tcp&amp;#39;;

export default async function () {
  const socket = new Socket();

  const closed = new Promise((resolve) =&amp;gt; {
    socket.on(&amp;#39;close&amp;#39;, () =&amp;gt; {
      console.log(&amp;#39;Connection closed&amp;#39;);
      resolve();
    });
  });

  socket.on(&amp;#39;data&amp;#39;, (data) =&amp;gt; {
    const str = new TextDecoder().decode(data);
    console.log(&amp;#39;Received:&amp;#39;, str);
    // Reset the timeout after each data event
    socket.setTimeout(5000);
  });

  socket.on(&amp;#39;timeout&amp;#39;, () =&amp;gt; {
    console.log(&amp;#39;No data received for 5 seconds — closing&amp;#39;);
    socket.destroy();
  });

  socket.on(&amp;#39;error&amp;#39;, (err) =&amp;gt; {
    console.error(&amp;#39;Error:&amp;#39;, err);
  });

  const host = __ENV.TCP_HOST || &amp;#39;localhost&amp;#39;;
  const port = __ENV.TCP_PORT || &amp;#39;8080&amp;#39;;

  await socket.connect(port, host);
  console.log(&amp;#39;Connected — waiting for data (5s timeout)&amp;#39;);

  // Set timeout after connecting; no immediate write so the idle timer can fire
  socket.setTimeout(5000);

  await closed;
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="socketsettimeout">Socket.setTimeout()&lt;/h1>
&lt;p>Sets the inactivity timeout for the socket. When the socket has been idle for &lt;code>timeout&lt;/code> milliseconds without receiving data, a &lt;code>timeout&lt;/code> event is emitted.&lt;/p></description></item><item><title>Socket.on( event, listener )</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/on/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-x-tcp/socket/on/</guid><content><![CDATA[&lt;h1 id=&#34;socketon&#34;&gt;Socket.on()&lt;/h1&gt;
&lt;p&gt;Registers an event listener for a socket lifecycle event. All event handlers execute in the context of the k6 VU event loop.&lt;/p&gt;
&lt;p&gt;Only one listener per event type is supported. Calling &lt;code&gt;on()&lt;/code&gt; for an event that already has a listener replaces the previous one.&lt;/p&gt;
&lt;h2 id=&#34;signature&#34;&gt;Signature&lt;/h2&gt;
&lt;!-- md-k6:skipall --&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;socket.on(event, listener);&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;parameters&#34;&gt;Parameters&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Parameter&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;event&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;string&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Event name: &lt;code&gt;&#39;connect&#39;&lt;/code&gt;, &lt;code&gt;&#39;data&#39;&lt;/code&gt;, &lt;code&gt;&#39;close&#39;&lt;/code&gt;, &lt;code&gt;&#39;error&#39;&lt;/code&gt;, or &lt;code&gt;&#39;timeout&#39;&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;listener&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;function&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Callback invoked when the event fires&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;events&#34;&gt;Events&lt;/h2&gt;
&lt;h3 id=&#34;connect&#34;&gt;connect&lt;/h3&gt;
&lt;p&gt;Emitted when the socket successfully establishes a connection to the remote server.&lt;/p&gt;
&lt;h4 id=&#34;signature-1&#34;&gt;Signature&lt;/h4&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;socket.on(&amp;#39;connect&amp;#39;, () =&amp;gt; {
  // Connection established
});&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;data&#34;&gt;data&lt;/h3&gt;
&lt;p&gt;Emitted when data is received from the remote endpoint. The data is provided as a &lt;code&gt;Uint8Array&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;signature-2&#34;&gt;Signature&lt;/h4&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;socket.on(&amp;#39;data&amp;#39;, (data) =&amp;gt; {
  // data is Uint8Array
});&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;parameters-1&#34;&gt;Parameters&lt;/h4&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Parameter&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;data&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Uint8Array&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The received data&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;close&#34;&gt;close&lt;/h3&gt;
&lt;p&gt;Emitted when the socket connection is fully closed, either by the local or remote side. This is the final event in the socket lifecycle and is emitted exactly once per socket.&lt;/p&gt;
&lt;h4 id=&#34;signature-3&#34;&gt;Signature&lt;/h4&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;socket.on(&amp;#39;close&amp;#39;, () =&amp;gt; {
  // Connection fully closed
});&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;error&#34;&gt;error&lt;/h3&gt;
&lt;p&gt;Emitted when a socket error occurs, such as a connection failure or network issue.&lt;/p&gt;
&lt;h4 id=&#34;signature-4&#34;&gt;Signature&lt;/h4&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;socket.on(&amp;#39;error&amp;#39;, (error) =&amp;gt; {
  // Handle error
});&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;parameters-2&#34;&gt;Parameters&lt;/h4&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Parameter&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;error&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Error&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The error object&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;timeout&#34;&gt;timeout&lt;/h3&gt;
&lt;p&gt;Emitted when the socket times out due to inactivity as configured by &lt;code&gt;setTimeout()&lt;/code&gt;. The socket doesn&amp;rsquo;t automatically close the connection—call destroy() to close it.&lt;/p&gt;
&lt;h4 id=&#34;signature-5&#34;&gt;Signature&lt;/h4&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;socket.on(&amp;#39;timeout&amp;#39;, () =&amp;gt; {
  // Inactivity timeout reached
});&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;void&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { Socket } from &amp;#39;k6/x/tcp&amp;#39;;

export default async function () {
  const socket = new Socket();

  const closed = new Promise((resolve) =&amp;gt; {
    socket.on(&amp;#39;close&amp;#39;, () =&amp;gt; {
      console.log(&amp;#39;Connection closed&amp;#39;);
      resolve();
    });
  });

  socket.on(&amp;#39;connect&amp;#39;, () =&amp;gt; {
    console.log(&amp;#39;Connected to server&amp;#39;);
  });

  socket.on(&amp;#39;data&amp;#39;, (data) =&amp;gt; {
    const str = new TextDecoder().decode(data);
    console.log(&amp;#39;Received:&amp;#39;, str);
    socket.destroy();
  });

  socket.on(&amp;#39;error&amp;#39;, (err) =&amp;gt; {
    console.error(&amp;#39;Socket error:&amp;#39;, err);
    socket.destroy();
  });

  socket.on(&amp;#39;timeout&amp;#39;, () =&amp;gt; {
    console.log(&amp;#39;Socket timed out&amp;#39;);
    socket.destroy();
  });

  const host = __ENV.TCP_HOST || &amp;#39;localhost&amp;#39;;
  const port = __ENV.TCP_PORT || &amp;#39;8080&amp;#39;;

  await socket.connect(port, host);
  await socket.write(&amp;#39;Hello, server!&amp;#39;);

  await closed;
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="socketon">Socket.on()&lt;/h1>
&lt;p>Registers an event listener for a socket lifecycle event. All event handlers execute in the context of the k6 VU event loop.&lt;/p>
&lt;p>Only one listener per event type is supported. Calling &lt;code>on()&lt;/code> for an event that already has a listener replaces the previous one.&lt;/p></description></item></channel></rss>