Bumps the react group in /rust/gui-client with 3 updates: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react), [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) and [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router). Updates `@types/react` from 19.1.9 to 19.1.12 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react">compare view</a></li> </ul> </details> <br /> Updates `@types/react-dom` from 19.1.7 to 19.1.9 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom">compare view</a></li> </ul> </details> <br /> Updates `react-router` from 7.7.1 to 7.8.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/remix-run/react-router/releases">react-router's releases</a>.</em></p> <blockquote> <h2>v7.8.2</h2> <p>See the changelog for release notes: <a href="https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v782">https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v782</a></p> <h2>v7.8.1</h2> <p>See the changelog for release notes: <a href="https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v781">https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v781</a></p> <h2>v7.8.0</h2> <p>See the changelog for release notes: <a href="https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v780">https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v780</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md">react-router's changelog</a>.</em></p> <blockquote> <h2>7.8.2</h2> <h3>Patch Changes</h3> <ul> <li> <p>[UNSTABLE] Remove Data Mode <code>future.unstable_middleware</code> flag from <code>createBrowserRouter</code> (<a href="https://redirect.github.com/remix-run/react-router/pull/14213">#14213</a>)</p> <ul> <li>This is only needed as a Framework Mode flag because of the route modules and the <code>getLoadContext</code> type behavior change</li> <li>In Data Mode, it's an opt-in feature because it's just a new property on a route object, so there's no behavior changes that necessitate a flag</li> </ul> </li> <li> <p>[UNSTABLE] Add <code><RouterProvider unstable_onError></code>/<code><HydratedRouter unstable_onError></code> prop for client side error reporting (<a href="https://redirect.github.com/remix-run/react-router/pull/14162">#14162</a>)</p> </li> <li> <p>server action revalidation opt out via $SKIP_REVALIDATION field (<a href="https://redirect.github.com/remix-run/react-router/pull/14154">#14154</a>)</p> </li> <li> <p>Properly escape interpolated param values in <code>generatePath()</code> (<a href="https://redirect.github.com/remix-run/react-router/pull/13530">#13530</a>)</p> </li> <li> <p>Maintain <code>ReadonlyMap</code> and <code>ReadonlySet</code> types in server response data. (<a href="https://redirect.github.com/remix-run/react-router/pull/13092">#13092</a>)</p> </li> <li> <p>[UNSTABLE] Delay serialization of <code>.data</code> redirects to 202 responses until after middleware chain (<a href="https://redirect.github.com/remix-run/react-router/pull/14205">#14205</a>)</p> </li> <li> <p>Fix <code>TypeError</code> if you throw from <code>patchRoutesOnNavigation</code> when no partial matches exist (<a href="https://redirect.github.com/remix-run/react-router/pull/14198">#14198</a>)</p> </li> <li> <p>Fix <code>basename</code> usage without a leading slash in data routers (<a href="https://redirect.github.com/remix-run/react-router/pull/11671">#11671</a>)</p> </li> <li> <p>[UNSTABLE] Update client middleware so it returns the data strategy results allowing for more advanced post-processing middleware (<a href="https://redirect.github.com/remix-run/react-router/pull/14151">#14151</a>)</p> </li> </ul> <h2>7.8.1</h2> <h3>Patch Changes</h3> <ul> <li>Fix usage of optional path segments in nested routes defined using absolute paths (<a href="https://redirect.github.com/remix-run/react-router/pull/14135">#14135</a>)</li> <li>Bubble client pre-next middleware error to the shallowest ancestor that needs to load, not strictly the shallowest ancestor with a loader (<a href="https://redirect.github.com/remix-run/react-router/pull/14150">#14150</a>)</li> <li>Fix optional static segment matching in <code>matchPath</code> (<a href="https://redirect.github.com/remix-run/react-router/pull/11813">#11813</a>)</li> <li>Fix prerendering when a <code>basename</code> is set with <code>ssr:false</code> (<a href="https://redirect.github.com/remix-run/react-router/pull/13791">#13791</a>)</li> <li>Provide <code>isRouteErrorResponse</code> utility in <code>react-server</code> environments (<a href="https://redirect.github.com/remix-run/react-router/pull/14166">#14166</a>)</li> <li>Propagate non-redirect Responses thrown from middleware to the error boundary on document/data requests (<a href="https://redirect.github.com/remix-run/react-router/pull/14182">#14182</a>)</li> <li>Handle <code>meta</code> and <code>links</code> Route Exports in RSC Data Mode (<a href="https://redirect.github.com/remix-run/react-router/pull/14136">#14136</a>)</li> <li>Properly convert returned/thrown <code>data()</code> values to <code>Response</code> instances via <code>Response.json()</code> in resource routes and middleware (<a href="https://redirect.github.com/remix-run/react-router/pull/14159">#14159</a>, <a href="https://redirect.github.com/remix-run/react-router/pull/14181">#14181</a>)</li> </ul> <h2>7.8.0</h2> <h3>Minor Changes</h3> <ul> <li>Add <code>nonce</code> prop to <code>Links</code> & <code>PrefetchPageLinks</code> (<a href="https://redirect.github.com/remix-run/react-router/pull/14048">#14048</a>)</li> <li>Add <code>loaderData</code> arguments/properties alongside existing <code>data</code> arguments/properties to provide consistency and clarity between <code>loaderData</code> and <code>actionData</code> across the board (<a href="https://redirect.github.com/remix-run/react-router/pull/14047">#14047</a>) <ul> <li>Updated types: <code>Route.MetaArgs</code>, <code>Route.MetaMatch</code>, <code>MetaArgs</code>, <code>MetaMatch</code>, <code>Route.ComponentProps.matches</code>, <code>UIMatch</code></li> <li><code>@deprecated</code> warnings have been added to the existing <code>data</code> properties to point users to new <code>loaderData</code> properties, in preparation for removing the <code>data</code> properties in a future major release</li> </ul> </li> </ul> <h3>Patch Changes</h3> <ul> <li>Prevent <em>"Did not find corresponding fetcher result"</em> console error when navigating during a <code>fetcher.submit</code> revalidation (<a href="https://redirect.github.com/remix-run/react-router/pull/14114">#14114</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="eade1de2db"><code>eade1de</code></a> chore: Update version for release (<a href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router/issues/14223">#14223</a>)</li> <li><a href="27eed3ae91"><code>27eed3a</code></a> chore: Update version for release (pre) (<a href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router/issues/14214">#14214</a>)</li> <li><a href="935fb25f65"><code>935fb25</code></a> fix(react-router/router): remove unused client side middleware future flag (#...</li> <li><a href="bebb46c5b6"><code>bebb46c</code></a> feat(react-router): server action revalidation opt out via `$SKIP_REVALIDATIO...</li> <li><a href="d10c7efe73"><code>d10c7ef</code></a> Update missed type for clientMiddleware (<a href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router/issues/14212">#14212</a>)</li> <li><a href="ef3016c11a"><code>ef3016c</code></a> chore: Update version for release (pre) (<a href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router/issues/14211">#14211</a>)</li> <li><a href="4dfb883c69"><code>4dfb883</code></a> Delay turbo-stream serialization of .data redirects (<a href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router/issues/14205">#14205</a>)</li> <li><a href="e9a17ed8ee"><code>e9a17ed</code></a> feat(react-router): add <code>unstable_onError</code> prop to <code>RouterProvider</code> for clien...</li> <li><a href="06519e286c"><code>06519e2</code></a> Serialize ReadonlyMap and ReadonlySet types (<a href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router/issues/13092">#13092</a>)</li> <li><a href="d7eb048aea"><code>d7eb048</code></a> chore: format</li> <li>Additional commits viewable in <a href="https://github.com/remix-run/react-router/commits/react-router@7.8.2/packages/react-router">compare view</a></li> </ul> </details> <br /> 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 </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Rust development guide
Firezone uses Rust for all data plane components. This directory contains the Linux and Windows clients, and low-level networking implementations related to STUN/TURN.
We target the last stable release of Rust using rust-toolchain.toml.
If you are using rustup, that is automatically handled for you.
Otherwise, ensure you have the latest stable version of Rust installed.
Reading Client logs
The Client logs are written as JSONL for machine-readability.
To make them more human-friendly, pipe them through jq like this:
cd path/to/logs # e.g. `$HOME/.cache/dev.firezone.client/data/logs` on Linux
cat *.log | jq -r '"\(.time) \(.severity) \(.message)"'
Resulting in, e.g.
2024-04-01T18:25:47.237661392Z INFO started log
2024-04-01T18:25:47.238193266Z INFO GIT_VERSION = 1.0.0-pre.11-35-gcc0d43531
2024-04-01T18:25:48.295243016Z INFO No token / actor_name on disk, starting in signed-out state
2024-04-01T18:25:48.295360641Z INFO null
Benchmarking on Linux
The recommended way for benchmarking any of the Rust components is Linux' perf utility.
For example, to attach to a running application, do:
- Ensure the binary you are profiling is compiled with the
releaseprofile. sudo perf record -g --freq 10000 --pid $(pgrep <your-binary>).- Run the speed test or whatever load-inducing task you want to measure.
sudo perf script > profile.perf- Open profiler.firefox.com and load
profile.perf
Instead of attaching to a process with --pid, you can also specify the path to executable directly.
That is useful if you want to capture perf data for a test or a micro-benchmark.