mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-12 08:45:38 +02:00
Bumps the npm_and_yarn group with 1 update in the /apps/docs directory: [koa](https://github.com/koajs/koa). Bumps the npm_and_yarn group with 1 update in the /apps/www directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). Bumps the npm_and_yarn group with 1 update in the /packages/www directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). Updates `koa` from 2.15.4 to 2.16.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/koajs/koa/releases">koa's releases</a>.</em></p> <blockquote> <h2>v2.16.1</h2> <p>fix: don't render redirect values in anchor ref</p> <h2>2.16.0</h2> <p>This is a backported release to fix core underlying issue with <code>HEAD</code> requests when using <code>http2.createSecureServer</code>. See discussion at <a href="https://redirect.github.com/koajs/koa/pull/1593">koajs/koa#1593</a> and <a href="https://redirect.github.com/koajs/koa/issues/1547">koajs/koa#1547</a>.</p> <ul> <li>fix missing cleanup, if response socket is no longer writeable (issue 1547) (<a href="https://redirect.github.com/koajs/koa/pull/1593">koajs/koa#1593</a>) 399cb6b0dd2104224c0ef0ce8e92f84e4f7faf42</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="ba14822069"><code>ba14822</code></a> 2.16.1</li> <li><a href="2ff6c3fb80"><code>2ff6c3f</code></a> 2.16.0</li> <li><a href="3d51d034af"><code>3d51d03</code></a> ci: allow codecov to fail</li> <li><a href="eb84d890b8"><code>eb84d89</code></a> fix: don't render redirect values in anchor ref</li> <li>See full diff in <a href="https://github.com/koajs/koa/compare/2.15.4...v2.16.1">compare view</a></li> </ul> </details> <br /> Updates `vite` from 5.4.16 to 6.0.14 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vitejs/vite/releases">vite's releases</a>.</em></p> <blockquote> <h2>v6.0.14</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.14/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.13</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.13/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.12</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.12/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.11</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.11/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.10</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.10/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.9</h2> <p>This version contains a breaking change due to security fixes. See <a href="https://github.com/vitejs/vite/security/advisories/GHSA-vg6x-rcgg-rjx6">https://github.com/vitejs/vite/security/advisories/GHSA-vg6x-rcgg-rjx6</a> for more details.</p> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.9/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.8</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.8/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.7</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.7/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.6</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.6/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.5</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.5/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.4</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.4/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.3</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.3/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.2</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.2/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>plugin-legacy@6.0.2</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/plugin-legacy@6.0.2/packages/plugin-legacy/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>create-vite@6.0.1</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/create-vite@6.0.1/packages/create-vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.1</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.1/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/vitejs/vite/blob/v6.0.14/packages/vite/CHANGELOG.md">vite's changelog</a>.</em></p> <blockquote> <h2><!-- raw HTML omitted -->6.0.14 (2025-04-03)<!-- raw HTML omitted --></h2> <ul> <li>fix: backport <a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19782">#19782</a>, fs check with svg and relative paths (<a href="48ee91df38">48ee91d</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19782">#19782</a></li> </ul> <h2><!-- raw HTML omitted -->6.0.13 (2025-03-31)<!-- raw HTML omitted --></h2> <ul> <li>fix: fs check in transform middleware (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19761">#19761</a>) (<a href="1487f393f3">1487f39</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19761">#19761</a></li> </ul> <h2><!-- raw HTML omitted -->6.0.12 (2025-03-24)<!-- raw HTML omitted --></h2> <ul> <li>fix: fs raw query with query separators (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19702">#19702</a>) (<a href="92ca12dc79">92ca12d</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19702">#19702</a></li> </ul> <h2><!-- raw HTML omitted -->6.0.11 (2025-01-21)<!-- raw HTML omitted --></h2> <ul> <li>fix: <code>preview.allowedHosts</code> with specific values was not respected (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19246">#19246</a>) (<a href="aeb3ec84a2">aeb3ec8</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19246">#19246</a></li> <li>fix: allow CORS from loopback addresses by default (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19249">#19249</a>) (<a href="3d03899737">3d03899</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19249">#19249</a></li> </ul> <h2><!-- raw HTML omitted -->6.0.10 (2025-01-20)<!-- raw HTML omitted --></h2> <ul> <li>fix: try parse <code>server.origin</code> URL (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19241">#19241</a>) (<a href="2495022420">2495022</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19241">#19241</a></li> </ul> <h2><!-- raw HTML omitted -->6.0.9 (2025-01-20)<!-- raw HTML omitted --></h2> <ul> <li>fix!: check host header to prevent DNS rebinding attacks and introduce <code>server.allowedHosts</code> (<a href="bd896fb5f3">bd896fb</a>)</li> <li>fix!: default <code>server.cors: false</code> to disallow fetching from untrusted origins (<a href="b09572acc9">b09572a</a>)</li> <li>fix: verify token for HMR WebSocket connection (<a href="029dcd6d77">029dcd6</a>)</li> </ul> <h2><!-- raw HTML omitted -->6.0.8 (2025-01-20)<!-- raw HTML omitted --></h2> <ul> <li>fix: avoid SSR HMR for HTML files (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19193">#19193</a>) (<a href="3bd55bcb7e">3bd55bc</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19193">#19193</a></li> <li>fix: build time display 7m 60s (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19108">#19108</a>) (<a href="cf0d2c8e23">cf0d2c8</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19108">#19108</a></li> <li>fix: don't resolve URL starting with double slash (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19059">#19059</a>) (<a href="35942cde11">35942cd</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19059">#19059</a></li> <li>fix: ensure <code>server.close()</code> only called once (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19204">#19204</a>) (<a href="db81c2dada">db81c2d</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19204">#19204</a></li> <li>fix: resolve.conditions in ResolvedConfig was <code>defaultServerConditions</code> (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19174">#19174</a>) (<a href="ad75c56dce">ad75c56</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19174">#19174</a></li> <li>fix: tree shake stringified JSON imports (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19189">#19189</a>) (<a href="f2aed62d0b">f2aed62</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19189">#19189</a></li> <li>fix: use shared sigterm callback (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19203">#19203</a>) (<a href="47039f4643">47039f4</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19203">#19203</a></li> <li>fix(deps): update all non-major dependencies (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19098">#19098</a>) (<a href="8639538e64">8639538</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19098">#19098</a></li> <li>fix(optimizer): use correct default install state path for yarn PnP (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19119">#19119</a>) (<a href="e690d8bb1e">e690d8b</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19119">#19119</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="f678baacaf"><code>f678baa</code></a> release: v6.0.14</li> <li><a href="48ee91df38"><code>48ee91d</code></a> fix: backport <a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19782">#19782</a>, fs check with svg and relative paths</li> <li><a href="0eaadcf952"><code>0eaadcf</code></a> release: v6.0.13</li> <li><a href="1487f393f3"><code>1487f39</code></a> fix: fs check in transform middleware (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19761">#19761</a>)</li> <li><a href="9d981f9d38"><code>9d981f9</code></a> release: v6.0.12</li> <li><a href="92ca12dc79"><code>92ca12d</code></a> fix: fs raw query with query separators (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19702">#19702</a>)</li> <li><a href="a0ed4057c9"><code>a0ed405</code></a> release: v6.0.11</li> <li><a href="3d03899737"><code>3d03899</code></a> fix: allow CORS from loopback addresses by default (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19249">#19249</a>)</li> <li><a href="aeb3ec84a2"><code>aeb3ec8</code></a> fix: <code>preview.allowedHosts</code> with specific values was not respected (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19246">#19246</a>)</li> <li><a href="9654348258"><code>9654348</code></a> release: v6.0.10</li> <li>Additional commits viewable in <a href="https://github.com/vitejs/vite/commits/v6.0.14/packages/vite">compare view</a></li> </ul> </details> <br /> Updates `vite` from 5.4.16 to 6.0.14 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vitejs/vite/releases">vite's releases</a>.</em></p> <blockquote> <h2>v6.0.14</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.14/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.13</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.13/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.12</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.12/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.11</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.11/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.10</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.10/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.9</h2> <p>This version contains a breaking change due to security fixes. See <a href="https://github.com/vitejs/vite/security/advisories/GHSA-vg6x-rcgg-rjx6">https://github.com/vitejs/vite/security/advisories/GHSA-vg6x-rcgg-rjx6</a> for more details.</p> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.9/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.8</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.8/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.7</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.7/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.6</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.6/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.5</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.5/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.4</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.4/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.3</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.3/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.2</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.2/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>plugin-legacy@6.0.2</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/plugin-legacy@6.0.2/packages/plugin-legacy/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>create-vite@6.0.1</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/create-vite@6.0.1/packages/create-vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v6.0.1</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v6.0.1/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/vitejs/vite/blob/v6.0.14/packages/vite/CHANGELOG.md">vite's changelog</a>.</em></p> <blockquote> <h2><!-- raw HTML omitted -->6.0.14 (2025-04-03)<!-- raw HTML omitted --></h2> <ul> <li>fix: backport <a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19782">#19782</a>, fs check with svg and relative paths (<a href="48ee91df38">48ee91d</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19782">#19782</a></li> </ul> <h2><!-- raw HTML omitted -->6.0.13 (2025-03-31)<!-- raw HTML omitted --></h2> <ul> <li>fix: fs check in transform middleware (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19761">#19761</a>) (<a href="1487f393f3">1487f39</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19761">#19761</a></li> </ul> <h2><!-- raw HTML omitted -->6.0.12 (2025-03-24)<!-- raw HTML omitted --></h2> <ul> <li>fix: fs raw query with query separators (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19702">#19702</a>) (<a href="92ca12dc79">92ca12d</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19702">#19702</a></li> </ul> <h2><!-- raw HTML omitted -->6.0.11 (2025-01-21)<!-- raw HTML omitted --></h2> <ul> <li>fix: <code>preview.allowedHosts</code> with specific values was not respected (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19246">#19246</a>) (<a href="aeb3ec84a2">aeb3ec8</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19246">#19246</a></li> <li>fix: allow CORS from loopback addresses by default (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19249">#19249</a>) (<a href="3d03899737">3d03899</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19249">#19249</a></li> </ul> <h2><!-- raw HTML omitted -->6.0.10 (2025-01-20)<!-- raw HTML omitted --></h2> <ul> <li>fix: try parse <code>server.origin</code> URL (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19241">#19241</a>) (<a href="2495022420">2495022</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19241">#19241</a></li> </ul> <h2><!-- raw HTML omitted -->6.0.9 (2025-01-20)<!-- raw HTML omitted --></h2> <ul> <li>fix!: check host header to prevent DNS rebinding attacks and introduce <code>server.allowedHosts</code> (<a href="bd896fb5f3">bd896fb</a>)</li> <li>fix!: default <code>server.cors: false</code> to disallow fetching from untrusted origins (<a href="b09572acc9">b09572a</a>)</li> <li>fix: verify token for HMR WebSocket connection (<a href="029dcd6d77">029dcd6</a>)</li> </ul> <h2><!-- raw HTML omitted -->6.0.8 (2025-01-20)<!-- raw HTML omitted --></h2> <ul> <li>fix: avoid SSR HMR for HTML files (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19193">#19193</a>) (<a href="3bd55bcb7e">3bd55bc</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19193">#19193</a></li> <li>fix: build time display 7m 60s (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19108">#19108</a>) (<a href="cf0d2c8e23">cf0d2c8</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19108">#19108</a></li> <li>fix: don't resolve URL starting with double slash (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19059">#19059</a>) (<a href="35942cde11">35942cd</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19059">#19059</a></li> <li>fix: ensure <code>server.close()</code> only called once (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19204">#19204</a>) (<a href="db81c2dada">db81c2d</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19204">#19204</a></li> <li>fix: resolve.conditions in ResolvedConfig was <code>defaultServerConditions</code> (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19174">#19174</a>) (<a href="ad75c56dce">ad75c56</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19174">#19174</a></li> <li>fix: tree shake stringified JSON imports (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19189">#19189</a>) (<a href="f2aed62d0b">f2aed62</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19189">#19189</a></li> <li>fix: use shared sigterm callback (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19203">#19203</a>) (<a href="47039f4643">47039f4</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19203">#19203</a></li> <li>fix(deps): update all non-major dependencies (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19098">#19098</a>) (<a href="8639538e64">8639538</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19098">#19098</a></li> <li>fix(optimizer): use correct default install state path for yarn PnP (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19119">#19119</a>) (<a href="e690d8bb1e">e690d8b</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/19119">#19119</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="f678baacaf"><code>f678baa</code></a> release: v6.0.14</li> <li><a href="48ee91df38"><code>48ee91d</code></a> fix: backport <a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19782">#19782</a>, fs check with svg and relative paths</li> <li><a href="0eaadcf952"><code>0eaadcf</code></a> release: v6.0.13</li> <li><a href="1487f393f3"><code>1487f39</code></a> fix: fs check in transform middleware (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19761">#19761</a>)</li> <li><a href="9d981f9d38"><code>9d981f9</code></a> release: v6.0.12</li> <li><a href="92ca12dc79"><code>92ca12d</code></a> fix: fs raw query with query separators (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19702">#19702</a>)</li> <li><a href="a0ed4057c9"><code>a0ed405</code></a> release: v6.0.11</li> <li><a href="3d03899737"><code>3d03899</code></a> fix: allow CORS from loopback addresses by default (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19249">#19249</a>)</li> <li><a href="aeb3ec84a2"><code>aeb3ec8</code></a> fix: <code>preview.allowedHosts</code> with specific values was not respected (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/19246">#19246</a>)</li> <li><a href="9654348258"><code>9654348</code></a> release: v6.0.10</li> <li>Additional commits viewable in <a href="https://github.com/vitejs/vite/commits/v6.0.14/packages/vite">compare view</a></li> </ul> </details> <br /> <details> <summary>Most Recent Ignore Conditions Applied to This Pull Request</summary> | Dependency Name | Ignore Conditions | | --- | --- | | vite | [< 5.5, > 5.4.16] | </details> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/nestrilabs/nestri/network/alerts). </details> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Wanjohi <elviswanjohi47@gmail.com>
361 lines
11 KiB
TypeScript
361 lines
11 KiB
TypeScript
import {
|
|
MessageBase,
|
|
MessageICE,
|
|
MessageJoin,
|
|
MessageSDP,
|
|
MessageAnswer,
|
|
JoinerType,
|
|
AnswerType,
|
|
} from "./messages";
|
|
|
|
//FIXME: Sometimes the room will wait to say offline, then appear to be online after retrying :D
|
|
// This works for me, with my trashy internet, does it work for you as well?
|
|
|
|
export class WebRTCStream {
|
|
private _ws: WebSocket | undefined = undefined;
|
|
private _pc: RTCPeerConnection | undefined = undefined;
|
|
private _audioTrack: MediaStreamTrack | undefined = undefined;
|
|
private _videoTrack: MediaStreamTrack | undefined = undefined;
|
|
private _dataChannel: RTCDataChannel | undefined = undefined;
|
|
private _onConnected: ((stream: MediaStream | null) => void) | undefined = undefined;
|
|
private _connectionTimer: NodeJS.Timeout | NodeJS.Timer | undefined = undefined;
|
|
private _serverURL: string | undefined = undefined;
|
|
private _roomName: string | undefined = undefined;
|
|
private _isConnected: boolean = false; // Add flag to track connection state
|
|
currentFrameRate: number = 60;
|
|
|
|
constructor(serverURL: string, roomName: string, connectedCallback: (stream: MediaStream | null) => void) {
|
|
if (roomName.length <= 0) {
|
|
console.error("Room name not provided");
|
|
return;
|
|
}
|
|
|
|
this._onConnected = connectedCallback;
|
|
this._serverURL = serverURL;
|
|
this._roomName = roomName;
|
|
this._setup(serverURL, roomName);
|
|
}
|
|
|
|
private _setup(serverURL: string, roomName: string) {
|
|
// Don't setup new connection if already connected
|
|
if (this._isConnected) {
|
|
console.log("Already connected, skipping setup");
|
|
return;
|
|
}
|
|
|
|
console.log("Setting up WebSocket");
|
|
const wsURL = serverURL.replace(/^http/, "ws");
|
|
this._ws = new WebSocket(`${wsURL}/api/ws/${roomName}`);
|
|
this._ws.onopen = async () => {
|
|
console.log("WebSocket opened");
|
|
// Send join message
|
|
const joinMessage: MessageJoin = {
|
|
payload_type: "join",
|
|
joiner_type: JoinerType.JoinerClient
|
|
};
|
|
this._ws!.send(JSON.stringify(joinMessage));
|
|
}
|
|
|
|
let iceHolder: RTCIceCandidateInit[] = [];
|
|
|
|
this._ws.onmessage = async (e) => {
|
|
// allow only JSON
|
|
if (typeof e.data === "object") return;
|
|
if (!e.data) return;
|
|
const message = JSON.parse(e.data) as MessageBase;
|
|
switch (message.payload_type) {
|
|
case "sdp":
|
|
if (!this._pc) {
|
|
// Setup peer connection now
|
|
this._setupPeerConnection();
|
|
}
|
|
console.log("Received SDP: ", (message as MessageSDP).sdp);
|
|
await this._pc!.setRemoteDescription((message as MessageSDP).sdp);
|
|
// Create our answer
|
|
const answer = await this._pc!.createAnswer();
|
|
// Force stereo in Chromium browsers
|
|
answer.sdp = this.forceOpusStereo(answer.sdp!);
|
|
await this._pc!.setLocalDescription(answer);
|
|
this._ws!.send(JSON.stringify({
|
|
payload_type: "sdp",
|
|
sdp: answer
|
|
}));
|
|
break;
|
|
case "ice":
|
|
if (!this._pc) break;
|
|
if (this._pc.remoteDescription) {
|
|
try {
|
|
await this._pc.addIceCandidate((message as MessageICE).candidate);
|
|
// Add held ICE candidates
|
|
for (const ice of iceHolder) {
|
|
try {
|
|
await this._pc.addIceCandidate(ice);
|
|
} catch (e) {
|
|
console.error("Error adding held ICE candidate: ", e);
|
|
}
|
|
}
|
|
iceHolder = [];
|
|
} catch (e) {
|
|
console.error("Error adding ICE candidate: ", e);
|
|
}
|
|
} else {
|
|
iceHolder.push((message as MessageICE).candidate);
|
|
}
|
|
break;
|
|
case "answer":
|
|
switch ((message as MessageAnswer).answer_type) {
|
|
case AnswerType.AnswerOffline:
|
|
console.log("Room is offline");
|
|
// Call callback with null stream
|
|
if (this._onConnected)
|
|
this._onConnected(null);
|
|
|
|
break;
|
|
case AnswerType.AnswerInUse:
|
|
console.warn("Room is in use, we shouldn't even be getting this message");
|
|
break;
|
|
case AnswerType.AnswerOK:
|
|
console.log("Joining Room was successful");
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
console.error("Unknown message type: ", message);
|
|
}
|
|
}
|
|
|
|
this._ws.onclose = () => {
|
|
console.log("WebSocket closed, reconnecting in 3 seconds");
|
|
if (this._onConnected)
|
|
this._onConnected(null);
|
|
|
|
// Clear PeerConnection
|
|
this._cleanupPeerConnection()
|
|
|
|
this._handleConnectionFailure()
|
|
// setTimeout(() => {
|
|
// this._setup(serverURL, roomName);
|
|
// }, this._connectionTimeout);
|
|
}
|
|
|
|
this._ws.onerror = (e) => {
|
|
console.error("WebSocket error: ", e);
|
|
}
|
|
}
|
|
|
|
// Forces opus to stereo in Chromium browsers, because of course
|
|
private forceOpusStereo(SDP: string): string {
|
|
// Look for "minptime=10;useinbandfec=1" and replace with "minptime=10;useinbandfec=1;stereo=1;sprop-stereo=1;"
|
|
return SDP.replace(/(minptime=10;useinbandfec=1)/, "$1;stereo=1;sprop-stereo=1;");
|
|
}
|
|
|
|
private _setupPeerConnection() {
|
|
if (this._pc) {
|
|
this._cleanupPeerConnection();
|
|
}
|
|
|
|
console.log("Setting up PeerConnection");
|
|
this._pc = new RTCPeerConnection({
|
|
iceServers: [
|
|
{
|
|
urls: "stun:stun.l.google.com:19302"
|
|
}
|
|
],
|
|
});
|
|
|
|
this._pc.ontrack = (e) => {
|
|
console.log("Track received: ", e.track);
|
|
if (e.track.kind === "audio")
|
|
this._audioTrack = e.track;
|
|
else if (e.track.kind === "video")
|
|
this._videoTrack = e.track;
|
|
|
|
this._checkConnectionState();
|
|
};
|
|
|
|
this._pc.onconnectionstatechange = () => {
|
|
console.log("Connection state changed to: ", this._pc!.connectionState);
|
|
this._checkConnectionState();
|
|
};
|
|
|
|
this._pc.oniceconnectionstatechange = () => {
|
|
console.log("ICE connection state changed to: ", this._pc!.iceConnectionState);
|
|
this._checkConnectionState();
|
|
};
|
|
|
|
this._pc.onicegatheringstatechange = () => {
|
|
console.log("ICE gathering state changed to: ", this._pc!.iceGatheringState);
|
|
this._checkConnectionState();
|
|
};
|
|
|
|
this._pc.onicecandidate = (e) => {
|
|
if (e.candidate) {
|
|
const message: MessageICE = {
|
|
payload_type: "ice",
|
|
candidate: e.candidate
|
|
};
|
|
this._ws!.send(JSON.stringify(message));
|
|
}
|
|
};
|
|
|
|
this._pc.ondatachannel = (e) => {
|
|
this._dataChannel = e.channel;
|
|
this._setupDataChannelEvents();
|
|
};
|
|
}
|
|
|
|
private _checkConnectionState() {
|
|
if (!this._pc) return;
|
|
|
|
console.log("Checking connection state:", {
|
|
connectionState: this._pc.connectionState,
|
|
iceConnectionState: this._pc.iceConnectionState,
|
|
hasAudioTrack: !!this._audioTrack,
|
|
hasVideoTrack: !!this._videoTrack,
|
|
isConnected: this._isConnected
|
|
});
|
|
|
|
if (this._pc.connectionState === "connected" && this._audioTrack !== undefined && this._videoTrack !== undefined) {
|
|
this._clearConnectionTimer();
|
|
if (!this._isConnected) {
|
|
// Only trigger callback if not already connected
|
|
this._isConnected = true;
|
|
if (this._onConnected !== undefined) {
|
|
this._onConnected(new MediaStream([this._audioTrack, this._videoTrack]));
|
|
|
|
// Continuously set low-latency target
|
|
this._pc.getReceivers().forEach((receiver: RTCRtpReceiver) => {
|
|
let intervalLoop = setInterval(async () => {
|
|
if (receiver.track.readyState !== "live" || (receiver.transport && receiver.transport.state !== "connected")) {
|
|
clearInterval(intervalLoop);
|
|
return;
|
|
} else {
|
|
// @ts-ignore
|
|
receiver.jitterBufferTarget = receiver.jitterBufferDelayHint = receiver.playoutDelayHint = 0;
|
|
}
|
|
}, 15);
|
|
});
|
|
}
|
|
}
|
|
|
|
this._gatherFrameRate();
|
|
} else if (this._pc.connectionState === "failed" ||
|
|
this._pc.connectionState === "closed" ||
|
|
this._pc.iceConnectionState === "failed") {
|
|
console.log("Connection failed or closed, attempting reconnect");
|
|
this._isConnected = false; // Reset connected state
|
|
this._handleConnectionFailure();
|
|
}
|
|
}
|
|
|
|
private _handleConnectionFailure() {
|
|
this._clearConnectionTimer();
|
|
if (this._isConnected) { // Only notify if previously connected
|
|
this._isConnected = false;
|
|
if (this._onConnected) {
|
|
this._onConnected(null);
|
|
}
|
|
}
|
|
this._cleanupPeerConnection();
|
|
|
|
// Attempt to reconnect only if not already connected
|
|
if (!this._isConnected && this._serverURL && this._roomName) {
|
|
this._setup(this._serverURL, this._roomName);
|
|
}
|
|
}
|
|
|
|
private _cleanupPeerConnection() {
|
|
if (this._pc) {
|
|
try {
|
|
this._pc.close();
|
|
} catch (err) {
|
|
console.error("Error closing peer connection:", err);
|
|
}
|
|
this._pc = undefined;
|
|
}
|
|
|
|
if (this._audioTrack || this._videoTrack) {
|
|
try {
|
|
if (this._audioTrack)
|
|
this._audioTrack.stop();
|
|
if (this._videoTrack)
|
|
this._videoTrack.stop();
|
|
} catch (err) {
|
|
console.error("Error stopping media tracks:", err);
|
|
}
|
|
this._audioTrack = undefined;
|
|
this._videoTrack = undefined;
|
|
}
|
|
|
|
if (this._dataChannel) {
|
|
try {
|
|
this._dataChannel.close();
|
|
} catch (err) {
|
|
console.error("Error closing data channel:", err);
|
|
}
|
|
this._dataChannel = undefined;
|
|
}
|
|
this._isConnected = false; // Reset connected state during cleanup
|
|
}
|
|
|
|
private _clearConnectionTimer() {
|
|
if (this._connectionTimer) {
|
|
clearTimeout(this._connectionTimer as any);
|
|
this._connectionTimer = undefined;
|
|
}
|
|
}
|
|
|
|
private _setupDataChannelEvents() {
|
|
if (!this._dataChannel) return;
|
|
|
|
this._dataChannel.onclose = () => console.log('sendChannel has closed')
|
|
this._dataChannel.onopen = () => console.log('sendChannel has opened')
|
|
this._dataChannel.onmessage = e => console.log(`Message from DataChannel '${this._dataChannel?.label}' payload '${e.data}'`)
|
|
}
|
|
|
|
private _gatherFrameRate() {
|
|
if (this._pc === undefined || this._videoTrack === undefined)
|
|
return;
|
|
|
|
const videoInfoPromise = new Promise<{ fps: number}>((resolve) => {
|
|
// Keep trying to get fps until it's found
|
|
const interval = setInterval(async () => {
|
|
if (this._pc === undefined) {
|
|
clearInterval(interval);
|
|
return;
|
|
}
|
|
|
|
const stats = await this._pc!.getStats(this._videoTrack);
|
|
stats.forEach((report) => {
|
|
if (report.type === "inbound-rtp") {
|
|
clearInterval(interval);
|
|
|
|
resolve({ fps: report.framesPerSecond });
|
|
}
|
|
});
|
|
}, 250);
|
|
});
|
|
|
|
videoInfoPromise.then((value) => {
|
|
this.currentFrameRate = value.fps
|
|
})
|
|
}
|
|
|
|
// Send binary message through the data channel
|
|
public sendBinary(data: Uint8Array) {
|
|
if (this._dataChannel && this._dataChannel.readyState === "open")
|
|
this._dataChannel.send(data);
|
|
else
|
|
console.log("Data channel not open or not established.");
|
|
}
|
|
|
|
public disconnect() {
|
|
this._clearConnectionTimer();
|
|
this._cleanupPeerConnection();
|
|
if (this._ws) {
|
|
this._ws.close();
|
|
this._ws = undefined;
|
|
}
|
|
this._isConnected = false;
|
|
}
|
|
} |