Skip to content

Develop - #325

Open
hltav wants to merge 6 commits into
masterfrom
develop
Open

hltav wants to merge 6 commits into
masterfrom
develop

Conversation

@hltav

@hltav hltav commented Oct 13, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

dependabot Bot and others added 6 commits October 12, 2026 16:38
Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.22.0 to 9.23.0.
- [Release notes](https://github.com/redis/go-redis/releases)
- [Changelog](https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md)
- [Commits](redis/go-redis@v9.22.0...v9.23.0)

---
updated-dependencies:
- dependency-name: github.com/redis/go-redis/v9
  dependency-version: 9.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [jsdom](https://github.com/jsdom/jsdom) from 25.0.1 to 30.1.2.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Commits](jsdom/jsdom@v25.0.1...v30.1.2)

---
updated-dependencies:
- dependency-name: jsdom
  dependency-version: 30.1.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [electron](https://github.com/electron/electron) from 42.11.12 to 44.7.0.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](electron/electron@v42.11.12...v44.7.0)

---
updated-dependencies:
- dependency-name: electron
  dependency-version: 44.7.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [electron](https://github.com/electron/electron) from 42.11.12 to
44.7.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/electron/electron/releases">electron's
releases</a>.</em></p>
<blockquote>
<h2>electron v44.7.0</h2>
<h1>Release Notes for v44.7.0</h1>
<h2>Features</h2>
<ul>
<li>The macOS <code>autoUpdater</code> now streams update downloads to
disk, resumes an interrupted download on the next check instead of
starting over, and applies a binary delta when the update feed offers
one for the running version. <a
href="https://redirect.github.com/electron/electron/pull/54204">#54204</a></li>
</ul>
<h2>Fixes</h2>
<ul>
<li>Fixed an uncatchable TypeError in <code>net.fetch</code> when
receiving response headers with non-ASCII characters, and preserved
multiple Set-Cookie headers. <a
href="https://redirect.github.com/electron/electron/pull/54672">#54672</a></li>
</ul>
<h2>Other Changes</h2>
<ul>
<li>Backported fixes from upstream ANGLE, Chromium, Dawn, fontconfig,
Skia, V8 and WebRTC. <a
href="https://redirect.github.com/electron/electron/pull/54666">#54666</a></li>
<li>Backported fixes from upstream ANGLE, Chromium, Skia, V8 and WebRTC.
<a
href="https://redirect.github.com/electron/electron/pull/54657">#54657</a></li>
</ul>
<h2>electron v44.6.0</h2>
<h1>Release Notes for v44.6.0</h1>
<h2>Features</h2>
<ul>
<li>Added the experimental <code>protocol.registerSource()</code> to
serve a custom scheme from directories on disk without a JavaScript
handler. <a
href="https://redirect.github.com/electron/electron/pull/54522">#54522</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/54521">45</a>)<!--
raw HTML omitted --></li>
</ul>
<h2>Fixes</h2>
<ul>
<li>Fixed a crash on launch on macOS when the system refused to register
the app for sleep/wake notifications. <a
href="https://redirect.github.com/electron/electron/pull/54596">#54596</a></li>
<li>Fixed a crash on <code>navigator.usb.requestDevice()</code> in
in-memory sessions. <a
href="https://redirect.github.com/electron/electron/pull/54616">#54616</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/54615">45</a>)<!--
raw HTML omitted --></li>
<li>Fixed <code>webview.findInPage()</code> hanging when the host page
also has an iframe. <a
href="https://redirect.github.com/electron/electron/pull/54586">#54586</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/54584">43</a>,
<a
href="https://redirect.github.com/electron/electron/pull/54585">45</a>)<!--
raw HTML omitted --></li>
<li>Updated time zone data to tzdata 2026d, including British Columbia's
move to permanent UTC-7. <a
href="https://redirect.github.com/electron/electron/pull/54623">#54623</a></li>
</ul>
<h2>Documentation</h2>
<ul>
<li>Documentation changes: <a
href="https://redirect.github.com/electron/electron/pull/54589">#54589</a></li>
</ul>
<h2>electron v44.5.1</h2>
<h1>Release Notes for v44.5.1</h1>
<h2>Other Changes</h2>
<ul>
<li>Backported fixes from upstream ANGLE, Chromium, Dawn and V8. <a
href="https://redirect.github.com/electron/electron/pull/54564">#54564</a></li>
</ul>
<h2>electron v44.5.0</h2>
<h1>Release Notes for v44.5.0</h1>
<h2>Features</h2>
<ul>
<li>Added launch-failure reporting with <code>systemErrorCode</code> to
the <code>app</code> <code>child-process-gone</code> event. <a
href="https://redirect.github.com/electron/electron/pull/54231">#54231</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/54230">45</a>)<!--
raw HTML omitted --></li>
</ul>
<h2>Fixes</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/electron/electron/commit/61f55c4ce540416b3e43f75f6c0f125d22e5e908"><code>61f55c4</code></a>
test: bound hidden overlay cold-process runs (<a
href="https://redirect.github.com/electron/electron/issues/54689">#54689</a>)</li>
<li><a
href="https://github.com/electron/electron/commit/a0c11d96a555542b9532b8d4ee2b93d3422e53ed"><code>a0c11d9</code></a>
feat: roll Squirrel.Mac for streamed, resumable and delta update
downloads (#...</li>
<li><a
href="https://github.com/electron/electron/commit/44cac486f7551d99eb982a37f1f29cc2e2568cb8"><code>44cac48</code></a>
test: wait for stable focus before checking openExternal removes focus
(<a
href="https://redirect.github.com/electron/electron/issues/54690">#54690</a>)</li>
<li><a
href="https://github.com/electron/electron/commit/505edea7d6208bf708c5bb6ac31bc3401e69d468"><code>505edea</code></a>
test: wait for the webview guest to load before navigating it (<a
href="https://redirect.github.com/electron/electron/issues/54673">#54673</a>)</li>
<li><a
href="https://github.com/electron/electron/commit/fbb54bba85115502d0187209aca82af9be579733"><code>fbb54bb</code></a>
test: run WebContentsView focusOnNavigation and shell.openExternal specs
seri...</li>
<li><a
href="https://github.com/electron/electron/commit/06209a5ab6eee82d400bf07eb136dd3c8b2e13b6"><code>06209a5</code></a>
fix(net): support non-ASCII headers and multiple cookies in net.fetch
(<a
href="https://redirect.github.com/electron/electron/issues/54672">#54672</a>)</li>
<li><a
href="https://github.com/electron/electron/commit/74f6399419f30b7948f281a4c3d92b235de06335"><code>74f6399</code></a>
chore: cherry-pick 47 changes from angle, chromium, dawn, fontconfig,
skia, v...</li>
<li><a
href="https://github.com/electron/electron/commit/3d7bdb5fcb2e8809c45b6df21a02a619ca8c9425"><code>3d7bdb5</code></a>
test: add mouse-input addon for setIgnoreMouseEvents specs (<a
href="https://redirect.github.com/electron/electron/issues/54605">#54605</a>)</li>
<li><a
href="https://github.com/electron/electron/commit/0498bc77bb5a47f48fa0e36f1846652f30925a7d"><code>0498bc7</code></a>
chore: cherry-pick 8 changes from angle, chromium, skia, v8 and webrtc
(<a
href="https://redirect.github.com/electron/electron/issues/54657">#54657</a>)</li>
<li><a
href="https://github.com/electron/electron/commit/d165ab9819606fa4202b009d3ece4a6598ff4f90"><code>d165ab9</code></a>
test: listen for both singleton exits before either can happen (<a
href="https://redirect.github.com/electron/electron/issues/54601">#54601</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/electron/electron/compare/v42.11.12...v44.7.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=electron&package-manager=npm_and_yarn&previous-version=42.11.12&new-version=44.7.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

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 show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>
Bumps [jsdom](https://github.com/jsdom/jsdom) from 25.0.1 to 30.1.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/jsdom/jsdom/releases">jsdom's
releases</a>.</em></p>
<blockquote>
<h2>v30.1.2</h2>
<ul>
<li>Updated URLs to support Unicode v18.0.0 in internationalized domain
names.</li>
<li>Reduced package size and memory use for CSS property definitions.
(<a href="https://github.com/scttcper"><code>@​scttcper</code></a>)</li>
<li>Fixed severe slowdowns when building large DOM trees, including SVG
charts with D3, which regressed in v30.1.0. (<a
href="https://github.com/cmdcolin"><code>@​cmdcolin</code></a>)</li>
<li>Fixed exponentially slow reads of empty inherited CSS custom
properties in deeply nested documents, and custom properties incorrectly
inheriting past an <code>initial</code> reset. (<a
href="https://github.com/scttcper"><code>@​scttcper</code></a>)</li>
<li>Fixed <code>getComputedStyle()</code> returning stale results after
editing stylesheet declarations, selectors, or media queries, including
in imported stylesheets.</li>
<li>Fixed selector matching and computed styles after changes to form
control checkedness, indeterminacy, selection, values, and validity,
including during form resets and canceled clicks.</li>
<li>Fixed computed styles for <code>:focus</code>,
<code>:focus-visible</code>, <code>:focus-within</code>, and selectors
containing them after focus changes, including inside focus and blur
listeners. (<a
href="https://github.com/asamuzaK"><code>@​asamuzaK</code></a>)</li>
<li>Fixed <code>element.focus()</code> incorrectly focusing elements
hidden by 'display', including through shadow hosts and slots, and
elements excluded by shadow DOM slot assignment. (<a
href="https://github.com/asamuzaK"><code>@​asamuzaK</code></a>)</li>
<li>Fixed <code>getComputedStyle()</code> throwing for elements without
inline-style support, including XML and MathML elements.</li>
<li>Fixed a memory leak where stylesheet parsing retained the last
parsed stylesheet's window after <code>window.close()</code>.</li>
<li>Fixed memory growth from long-lived <code>MutationObserver</code>
instances retaining bookkeeping for garbage-collected nodes. (<a
href="https://github.com/scttcper"><code>@​scttcper</code></a>)</li>
<li>Fixed retained <code>select.selectedOptions</code> collections
becoming stale after selection changes and form resets.</li>
<li>Fixed rejection of negative CSS sizing values, including for
'min-width', 'min-height', 'max-width', and 'max-height', which
regressed in v30.1.0.</li>
<li>Fixed handling of deeply nested <code>color-mix()</code>
expressions, including exceptions during color resolution. (<a
href="https://github.com/asamuzaK"><code>@​asamuzaK</code></a>)</li>
</ul>
<h2>v30.1.1</h2>
<ul>
<li>Fixed spurious window <code>blur</code> and <code>focusout</code>
events and incorrect <code>event.relatedTarget</code> values when
focusing an element after removing the previously focused element, which
regressed in v30.1.0. (<a
href="https://github.com/asamuzaK"><code>@​asamuzaK</code></a>)</li>
<li>Fixed focus and blur behavior across frames, and focusing the
document's viewport through
<code>document.documentElement.focus()</code>. (<a
href="https://github.com/asamuzaK"><code>@​asamuzaK</code></a>)</li>
<li>Fixed focus targets removed or disabled by <code>blur</code>
listeners becoming active, and text selections made by focus and blur
listeners being overwritten. (<a
href="https://github.com/asamuzaK"><code>@​asamuzaK</code></a>)</li>
<li>Fixed <code>element.focus()</code> incorrectly focusing disabled
form controls and <code>&lt;input type=&quot;hidden&quot;&gt;</code>
elements with <code>tabindex=&quot;&quot;</code>. (<a
href="https://github.com/scttcper"><code>@​scttcper</code></a>)</li>
<li>Fixed invalid <code>style.setProperty()</code> calls changing
existing <code>!important</code> priorities, serialized styles, or
mutation records. (<a
href="https://github.com/FedgeNo"><code>@​FedgeNo</code></a>)</li>
<li>Fixed <code>!important</code> handling when updating CSS longhands
after shorthands, using variables or CSS-wide keywords, and assigning
style properties directly. (<a
href="https://github.com/FedgeNo"><code>@​FedgeNo</code></a>)</li>
<li>Fixed <code>&lt;noscript&gt;</code> parsing with
<code>includeNodeLocations: true</code> or inside frames to honor the
<code>runScripts</code> option.</li>
<li>Fixed the <code>storageQuota</code> option being ignored by
frames.</li>
<li>Fixed encoding detection of HTML and XML byte input to honor XML
encoding declarations and detect UTF-16 without a byte order mark.</li>
<li>Fixed exceptions caused by truncated <code>charset</code> parameters
in <code>&lt;meta&gt;</code> elements, and encoding detection
incorrectly using incomplete <code>&lt;meta&gt;</code> tags. (<a
href="https://github.com/FedgeNo"><code>@​FedgeNo</code></a>)</li>
<li>Fixed XML serialization errors for namespaces named
<code>constructor</code>, <code>toString</code>, <code>__proto__</code>,
or <code>&quot;null&quot;</code>, and incorrect reuse of namespace
prefixes declared on sibling elements.</li>
<li>Fixed <code>element.innerHTML</code> and
<code>element.outerHTML</code> in XML documents to reject invalid
characters in attribute values and avoid stack overflows on large
strings.</li>
<li>Fixed selector matching for <code>:lang()</code>,
<code>:nth-child(... of ...)</code> after mutations, and
<code>:has()</code> with duplicate IDs or nested logical pseudo-classes.
(<a href="https://github.com/asamuzaK"><code>@​asamuzaK</code></a>)</li>
</ul>
<h2>v30.1.0</h2>
<p>jsdom is feeling the AGI!</p>
<p>This release is dedicated to <a
href="https://github.com/scttcper"><code>@​scttcper</code></a>, who
unleashed <a href="https://github.com/codex"><code>@​codex</code></a>
upon jsdom and found tons of performance improvements. Along the way, he
found and fixed many correctness issues as well.</p>
<p>We really appreciate his thoughtful PRs, which did a great job
following the project's contribution guidelines, and were clearly
human-curated, with their PR descriptions edited to be brief and
respectful of the maintainers' time.</p>
<p>Thanks to <a
href="https://github.com/scttcper"><code>@​scttcper</code></a>, as well
as all the other contributors of this release (most of whom were
AI-assisted).</p>
<ul>
<li>Added named access to elements on <code>document</code>, such as
<code>document.myForm</code> for <code>&lt;form
name=&quot;myForm&quot;&gt;</code>. (<a
href="https://github.com/vojtisprime11"><code>@​vojtisprime11</code></a>)</li>
<li>Added <code>QuotaExceededError</code>, including its use for storage
quota errors and oversized <code>crypto.getRandomValues()</code>
requests.</li>
<li>Added support for the relaxed DOM naming rules when creating
elements, attributes, and document types.</li>
<li>Improved performance of DOM construction, tree mutations, range
operations, and live collection access, especially on large documents.
(<a href="https://github.com/scttcper"><code>@​scttcper</code></a>, <a
href="https://github.com/erezrokah"><code>@​erezrokah</code></a>)</li>
<li>Improved performance of <code>getComputedStyle()</code>, style
changes, and CSS serialization. (<a
href="https://github.com/scttcper"><code>@​scttcper</code></a>, <a
href="https://github.com/jhult"><code>@​jhult</code></a>)</li>
<li>Improved performance of event dispatch, form control and label
lookups, and updates to <code>&lt;select&gt;</code> elements and radio
button groups. (<a
href="https://github.com/scttcper"><code>@​scttcper</code></a>)</li>
<li>Reduced memory use when creating and working with DOM nodes,
attributes, event listeners, and mutation observers. (<a
href="https://github.com/scttcper"><code>@​scttcper</code></a>)</li>
<li>Changed <code>window.close()</code> to preserve access to the
document and its DOM through retained references.</li>
<li>Fixed <code>element.querySelectorAll()</code> returning no matches
when the first part of the selector matches the element itself, which
regressed in v30.0.0. (<a
href="https://github.com/asamuzaK"><code>@​asamuzaK</code></a>)</li>
<li>Fixed case sensitivity in CSS attribute selectors, including
selectors matching <code>data-state=&quot;&quot;</code>,
<code>title=&quot;&quot;</code>, and other case-sensitive values. (<a
href="https://github.com/asamuzaK"><code>@​asamuzaK</code></a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/jsdom/jsdom/commit/a23bfb72b5a3fc776db51ae1bccabf46af8a9e38"><code>a23bfb7</code></a>
30.1.2</li>
<li><a
href="https://github.com/jsdom/jsdom/commit/64a75d240db0744cbfeff6f740b07c4da47cee99"><code>64a75d2</code></a>
Update dependencies and dev dependencies</li>
<li><a
href="https://github.com/jsdom/jsdom/commit/7bf9653bf12f8ed61255fddf065b1f27afbb6993"><code>7bf9653</code></a>
Invalidate styles after CSSOM and control state changes</li>
<li><a
href="https://github.com/jsdom/jsdom/commit/fe9009c91a09dedd6519c65d8d5b266cce400fa2"><code>fe9009c</code></a>
Update focused area handling</li>
<li><a
href="https://github.com/jsdom/jsdom/commit/a8d28b3ec0ae3f747a2a8bd2547517c358d00f9a"><code>a8d28b3</code></a>
Release windows retained by stylesheet parsing</li>
<li><a
href="https://github.com/jsdom/jsdom/commit/05a2c01549640ad820f6681e0549bf4aab316bbf"><code>05a2c01</code></a>
Deduplicate generated CSS property metadata</li>
<li><a
href="https://github.com/jsdom/jsdom/commit/1efa190736aa040ac1264e9009fa809d45d98c28"><code>1efa190</code></a>
Reduce generated CSS property data</li>
<li><a
href="https://github.com/jsdom/jsdom/commit/a372e12fd6eeedadc16c11a12e7c155b8cba7c46"><code>a372e12</code></a>
Avoid Document named-property rebuilds after irrelevant tree
mutations</li>
<li><a
href="https://github.com/jsdom/jsdom/commit/b2cd235170228c83cafe6d0ff542419aa7fa6221"><code>b2cd235</code></a>
Update css-color</li>
<li><a
href="https://github.com/jsdom/jsdom/commit/0542d2b8efe917ed37423d37f63488851613058d"><code>0542d2b</code></a>
Release idle MutationObserver bookkeeping</li>
<li>Additional commits viewable in <a
href="https://github.com/jsdom/jsdom/compare/v25.0.1...v30.1.2">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~GitHub%20Actions">GitHub Actions</a>, a new
releaser for jsdom since your current version.</p>
</details>
<details>
<summary>Install script changes</summary>
<p>This version modifies <code>prepare</code> script that runs during
installation. Review the package contents before updating.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=jsdom&package-manager=npm_and_yarn&previous-version=25.0.1&new-version=30.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

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 show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>
…in /scraper-go (#315)

Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis)
from 9.22.0 to 9.23.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/redis/go-redis/releases">github.com/redis/go-redis/v9's
releases</a>.</em></p>
<blockquote>
<h2>9.23.0</h2>
<p>This is a minor release. It contains everything from 9.23.0-beta.1,
so these notes cover the full 9.22.0 → 9.23.0 upgrade.</p>
<p>⚠️ Changes to check when you upgrade from 9.22.0:</p>
<ul>
<li><strong>Go 1.26 is now the minimum Go version</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4060">#4060</a>).
The <code>go</code> directive of the root module and of the submodules
moved from <code>1.24</code> to <code>1.26</code>, as part of the
dependency bumps for <code>govulncheck</code> findings. Projects that
build with Go 1.24 or 1.25 must upgrade the toolchain.</li>
<li><strong>Each <code>Client</code> has a dedicated pipeline connection
pool</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4002">#4002</a>).
This includes failover clients and cluster node clients.
<code>Pipeline</code>, <code>TxPipeline</code>, and autopipeline
operations use this pool, so they do not compete with regular commands
for main-pool connections. The pool is for burst capacity only: it dials
only when necessary, an unused pool holds zero connections, and if the
pool is full an operation uses the main pool. Set
<code>PipelinePoolSize: -1</code> to get the previous single-pool
behavior.</li>
<li><strong><code>AutoPipelineOptions.MaxBatchBytes</code> has a default
of 128 KiB</strong> (before, there was no limit). The default prevents a
write/reply deadlock; it is not a throughput control. The buffers of the
pipeline pool also have a default of 128 KiB.</li>
</ul>
<p>⚠️ Changes to experimental APIs since 9.23.0-beta.1 (no effect if you
upgrade from 9.22.0):</p>
<ul>
<li><strong><code>AutoPipelineOptions.FullDuplexFastSubmit</code> is
removed</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4018">#4018</a>).
The submit channel is replaced by a queue that takes a full wave of
commands in one lock, so the separate fast path is not necessary. Remove
the field from your options.</li>
<li><strong><code>Options.ClientSideCacheRefreshRecencyWindow</code> is
removed</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4034">#4034</a>).
Refresh-on-invalidate now reads again every cached entry of an
invalidated key and does not look at how recently the entry was read. On
a write-heavy keyspace this means refresh traffic across the full
resident cache. Remove the field from your options.</li>
<li><strong><code>LocalCache.LRUClock()</code> is removed</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4034">#4034</a>).
It returned the recency token that the removed recency window used, and
has no replacement. Remove calls to it.</li>
<li><strong><code>ClientSideCacheInvalidationBatchWindow</code> served
stale values in beta.1</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4033">#4033</a>).
Under load the batcher applied only ~15% of invalidations, and the cache
served invalidated values with a ~100% hit rate. 9.23.0 applies all of
them. If you used this option on beta.1, upgrade.</li>
</ul>
<h2>🚀 Highlights</h2>
<h3>Full-Duplex Auto-Pipelining (Experimental)</h3>
<p>Set <code>AutoPipelineOptions.FullDuplex</code> to enable the
full-duplex mode of the automatic pipeliner. The default mode sends one
batch per round trip. In full-duplex mode the engine holds one
pipeline-pool connection, and a writer goroutine and a reader goroutine
move the ordered command stream in both directions at the same time. On
a high-latency link each command completes in approximately one
round-trip time (RTT) on a single connection. On a 50 ms WAN profile:
~389k ops/s at 52 ms p50, against ~207k ops/s at 116 ms on the
half-duplex ordered path.</p>
<p>The mode works on both faces of a standalone <code>Client</code>
(<code>AutoPipeline()</code> and <code>AsyncAutoPipeline()</code>), and
natively on a <code>ClusterClient</code> when routing goes to masters
only. On a cluster, one child engine per master sends each command to
the node that owns its slot, and follows <code>MOVED</code> /
<code>ASK</code> redirects and retryable replies (<code>LOADING</code>,
<code>READONLY</code>, ...) through the usual cluster redirect path.
With replica routing (<code>ReadOnly</code>,
<code>RouteByLatency</code>, or <code>RouteRandomly</code>), the
autopipeliner uses the half-duplex shard flushers, which obey the shard
picker. <code>Config().FullDuplex</code> reports the mode in effect.</p>
<p>Options:</p>
<ul>
<li><code>FullDuplexWindow</code> — the maximum number of commands in
flight (backpressure).</li>
<li><code>FullDuplexIdleTimeout</code> and
<code>FullDuplexMaxHold</code> — when the engine returns the held
connection to the pool. The pool hooks then do re-authentication and
maintenance-notification handoffs.</li>
<li><code>MaxFlushDelay</code> — now also used in full-duplex mode (<a
href="https://redirect.github.com/redis/go-redis/pull/4014">#4014</a>).
The writer waits only when enough commands are in flight, so
low-concurrency callers keep the 1×RTT behavior. With
<code>MaxFlushDelay=250µs</code> at 1024 callers: +22% ops/s and −26%
p99. The default is 0, so this is opt-in.</li>
<li><code>NumShards</code> — on a standalone <code>Client</code>, the
number of full-duplex engines (<a
href="https://redirect.github.com/redis/go-redis/pull/4022">#4022</a>).
See below.</li>
</ul>
<p><strong><code>Pipeline()</code> on the full-duplex
connection</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4021">#4021</a>).
Standalone <code>Client</code> only. Before, <code>ap.Pipeline()</code>
used a pooled connection for each <code>Exec</code>. It now submits the
batch to the engine as one contiguous run (<code>FDPipelined</code>), so
replies come back in submit order, as on a dedicated connection. At
256–1024 callers with 10 commands per <code>Exec</code>: +49% to +52%
throughput on one socket instead of ~150. Errors, retries, hooks, and
metrics behave like an ordinary pipeline. A batch that cannot use the
stream (a blocking command, a per-command read timeout, a diverted
command, or a batch larger than the queue) falls back to the ordinary
pipeline. <code>TxPipeline</code> stays on a pooled connection, because
<code>MULTI</code>/<code>EXEC</code> needs connection affinity. On a
<code>ClusterClient</code>, <code>ap.Pipeline()</code> is still the
ordinary cluster pipeline. A batch that the queue cannot admit now
reserves its slots and waits in a first-come line, so single commands
cannot starve a long pipeline (<a
href="https://redirect.github.com/redis/go-redis/pull/4057">#4057</a>,
merged as part of <a
href="https://redirect.github.com/redis/go-redis/pull/4021">#4021</a>)
by <a
href="https://github.com/vlady-kotsev"><code>@​vlady-kotsev</code></a>.</p>
<p><strong>Several engines on one client</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4022">#4022</a>).
With <code>FullDuplex</code>, <code>NumShards &gt; 1</code> now means N
engines on one client: one pool, one hook chain, N held connections.
Commands route by a hash of their first key, so commands on the same key
stay on one connection and keep their order without
<code>Unordered</code>. Keyless commands are distributed round-robin. An
<code>FDPipelined</code> batch stays on one engine. The pipeline pool
must hold at least <code>NumShards</code> connections for each
full-duplex autopipeliner. More engines help only under high
concurrency: with 10-command pipelines, 8 engines were 30% slower than 1
at 8 callers, equal at about 128 callers, and 2.2× faster at 1024
callers.</p>
<p>The full-duplex path supports blocking commands,
<code>Options.Limiter</code> (one admission per written batch),
per-command and pipeline hooks, OTel metrics, retry budgets (a
<code>NoRetry</code> command is never sent again after it is on the
wire), and seamless maintenance handoffs. Limits of the stream
model:</p>
<ul>
<li><strong>A hook can observe a command, but cannot stop it.</strong> A
<code>ProcessHook</code> that returns without calling <code>next</code>
does not cancel the command on the full-duplex path; the command is
already queued on the held connection. Run policy or kill-switch hooks
on a plain client or on the half-duplex autopipeliner.</li>
<li><strong>Diverted commands are not ordered with the stream.</strong>
The engine diverts blocking commands, connection-hostile commands, and
managed <code>HIMPORT</code> commands. On the async face, wait for the
result of a diverted command before you submit a command that depends on
it.</li>
<li><strong>Single commands on the full-duplex stream do not use the
client-side cache.</strong> If CSC is enabled, a cacheable command on
the stream does not read or write the cache.</li>
<li><strong>Duration metrics are recorded per reply.</strong> A command
that fails before it reaches the reader (lease failure, limiter denial,
retry exhaustion, close) calls the error callback but records no
operation-duration sample.</li>
</ul>
<pre lang="go"><code>rdb := redis.NewClient(&amp;redis.Options{
	Addr: &quot;localhost:6379&quot;,
	AutoPipelineOptions: &amp;redis.AutoPipelineOptions{
FullDuplex: true, // stream commands on one held connection, ~1 RTT each
	},
})
defer rdb.Close()
&lt;/tr&gt;&lt;/table&gt; 
</code></pre>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md">github.com/redis/go-redis/v9's
changelog</a>.</em></p>
<blockquote>
<h1>9.23.0 (2026-10-05)</h1>
<p>This is a minor release. It contains everything from 9.23.0-beta.1,
so these notes cover the full 9.22.0 → 9.23.0 upgrade. The release
adds:</p>
<ul>
<li>An experimental <strong>full-duplex mode</strong> for the automatic
pipeliner, now with <code>Pipeline()</code> on the full-duplex
connection and several engines on one client.</li>
<li>Refresh-on-invalidate and miss coalescing for client-side caching,
and a faster cache read path.</li>
<li>Better distribution of cluster reads under latency-based
routing.</li>
<li><code>Client.EphemeralConn</code>, an opt-in limit on queued
autopipeline commands, and many stability fixes.</li>
</ul>
<p>⚠️ Changes to check when you upgrade from 9.22.0:</p>
<ul>
<li><strong>Go 1.26 is now the minimum Go version</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4060">#4060</a>).
The <code>go</code> directive of the root module and of the submodules
moved from <code>1.24</code> to <code>1.26</code>, as part of the
dependency bumps for <code>govulncheck</code> findings. Projects that
build with Go 1.24 or 1.25 must upgrade the toolchain.</li>
<li><strong>Each <code>Client</code> has a dedicated pipeline connection
pool</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4002">#4002</a>).
This includes failover clients and cluster node clients.
<code>Pipeline</code>, <code>TxPipeline</code>, and autopipeline
operations use this pool, so they do not compete with regular commands
for main-pool connections. The pool is for burst capacity only: it dials
only when necessary, an unused pool holds zero connections, and if the
pool is full an operation uses the main pool. Set
<code>PipelinePoolSize: -1</code> to get the previous single-pool
behavior.</li>
<li><strong><code>AutoPipelineOptions.MaxBatchBytes</code> has a default
of 128 KiB</strong> (before, there was no limit). The default prevents a
write/reply deadlock; it is not a throughput control. The buffers of the
pipeline pool also have a default of 128 KiB.</li>
</ul>
<p>⚠️ Changes to experimental APIs since 9.23.0-beta.1 (no effect if you
upgrade from 9.22.0):</p>
<ul>
<li><strong><code>AutoPipelineOptions.FullDuplexFastSubmit</code> is
removed</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4018">#4018</a>).
The submit channel is replaced by a queue that takes a full wave of
commands in one lock, so the separate fast path is not necessary. Remove
the field from your options.</li>
<li><strong><code>Options.ClientSideCacheRefreshRecencyWindow</code> is
removed</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4034">#4034</a>).
Refresh-on-invalidate now reads again every cached entry of an
invalidated key and does not look at how recently the entry was read. On
a write-heavy keyspace this means refresh traffic across the full
resident cache. Remove the field from your options.</li>
<li><strong><code>LocalCache.LRUClock()</code> is removed</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4034">#4034</a>).
It returned the recency token that the removed recency window used, and
has no replacement. Remove calls to it.</li>
<li><strong><code>ClientSideCacheInvalidationBatchWindow</code> served
stale values in beta.1</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4033">#4033</a>).
Under load the batcher applied only ~15% of invalidations, and the cache
served invalidated values with a ~100% hit rate. 9.23.0 applies all of
them. If you used this option on beta.1, upgrade.</li>
</ul>
<h2>🚀 Highlights</h2>
<h3>Full-Duplex Auto-Pipelining (Experimental)</h3>
<p>Set <code>AutoPipelineOptions.FullDuplex</code> to enable the
full-duplex mode of the automatic pipeliner. The default mode sends one
batch per round trip. In full-duplex mode the engine holds one
pipeline-pool connection, and a writer goroutine and a reader goroutine
move the ordered command stream in both directions at the same time. On
a high-latency link each command completes in approximately one
round-trip time (RTT) on a single connection. On a 50 ms WAN profile:
~389k ops/s at 52 ms p50, against ~207k ops/s at 116 ms on the
half-duplex ordered path.</p>
<p>The mode works on both faces of a standalone <code>Client</code>
(<code>AutoPipeline()</code> and <code>AsyncAutoPipeline()</code>), and
natively on a <code>ClusterClient</code> when routing goes to masters
only. On a cluster, one child engine per master sends each command to
the node that owns its slot, and follows <code>MOVED</code> /
<code>ASK</code> redirects and retryable replies (<code>LOADING</code>,
<code>READONLY</code>, ...) through the usual cluster redirect path.
With replica routing (<code>ReadOnly</code>,
<code>RouteByLatency</code>, or <code>RouteRandomly</code>), the
autopipeliner uses the half-duplex shard flushers, which obey the shard
picker. <code>Config().FullDuplex</code> reports the mode in effect.</p>
<p>Options:</p>
<ul>
<li><code>FullDuplexWindow</code> — the maximum number of commands in
flight (backpressure).</li>
<li><code>FullDuplexIdleTimeout</code> and
<code>FullDuplexMaxHold</code> — when the engine returns the held
connection to the pool. The pool hooks then do re-authentication and
maintenance-notification handoffs.</li>
<li><code>MaxFlushDelay</code> — now also used in full-duplex mode (<a
href="https://redirect.github.com/redis/go-redis/pull/4014">#4014</a>).
The writer waits only when enough commands are in flight, so
low-concurrency callers keep the 1×RTT behavior. With
<code>MaxFlushDelay=250µs</code> at 1024 callers: +22% ops/s and −26%
p99. The default is 0, so this is opt-in.</li>
<li><code>NumShards</code> — on a standalone <code>Client</code>, the
number of full-duplex engines (<a
href="https://redirect.github.com/redis/go-redis/pull/4022">#4022</a>).
See below.</li>
</ul>
<p><strong><code>Pipeline()</code> on the full-duplex
connection</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4021">#4021</a>).
Standalone <code>Client</code> only. Before, <code>ap.Pipeline()</code>
used a pooled connection for each <code>Exec</code>. It now submits the
batch to the engine as one contiguous run (<code>FDPipelined</code>), so
replies come back in submit order, as on a dedicated connection. At
256–1024 callers with 10 commands per <code>Exec</code>: +49% to +52%
throughput on one socket instead of ~150. Errors, retries, hooks, and
metrics behave like an ordinary pipeline. A batch that cannot use the
stream (a blocking command, a per-command read timeout, a diverted
command, or a batch larger than the queue) falls back to the ordinary
pipeline. <code>TxPipeline</code> stays on a pooled connection, because
<code>MULTI</code>/<code>EXEC</code> needs connection affinity. On a
<code>ClusterClient</code>, <code>ap.Pipeline()</code> is still the
ordinary cluster pipeline. A batch that the queue cannot admit now
reserves its slots and waits in a first-come line, so single commands
cannot starve a long pipeline (<a
href="https://redirect.github.com/redis/go-redis/pull/4057">#4057</a>,
merged as part of <a
href="https://redirect.github.com/redis/go-redis/pull/4021">#4021</a>)
by <a
href="https://github.com/vlady-kotsev"><code>@​vlady-kotsev</code></a>.</p>
<p><strong>Several engines on one client</strong> (<a
href="https://redirect.github.com/redis/go-redis/pull/4022">#4022</a>).
With <code>FullDuplex</code>, <code>NumShards &gt; 1</code> now means N
engines on one client: one pool, one hook chain, N held connections.
Commands route by a hash of their first key, so commands on the same key
stay on one connection and keep their order without
<code>Unordered</code>. Keyless commands are distributed round-robin. An
<code>FDPipelined</code> batch stays on one engine. The pipeline pool
must hold at least <code>NumShards</code> connections for each
full-duplex autopipeliner. More engines help only under high
concurrency: with 10-command pipelines, 8 engines were 30% slower than 1
at 8 callers, equal at about 128 callers, and 2.2× faster at 1024
callers.</p>
<p>The full-duplex path supports blocking commands,
<code>Options.Limiter</code> (one admission per written batch),
per-command and pipeline hooks, OTel metrics, retry budgets (a
<code>NoRetry</code> command is never sent again after it is on the
wire), and seamless maintenance handoffs. Limits of the stream
model:</p>
<ul>
<li><strong>A hook can observe a command, but cannot stop it.</strong> A
<code>ProcessHook</code> that returns without calling <code>next</code>
does not cancel the command on the full-duplex path; the command is
already queued on the held connection. Run policy or kill-switch hooks
on a plain client or on the half-duplex autopipeliner.</li>
<li><strong>Diverted commands are not ordered with the stream.</strong>
The engine diverts blocking commands, connection-hostile commands, and
managed <code>HIMPORT</code> commands. On the async face, wait for the
result of a diverted command before you submit a command that depends on
it.</li>
<li><strong>Single commands on the full-duplex stream do not use the
client-side cache.</strong> If CSC is enabled, a cacheable command on
the stream does not read or write the cache.</li>
<li><strong>Duration metrics are recorded per reply.</strong> A command
that fails before it reaches the reader (lease failure, limiter denial,
retry exhaustion, close) calls the error callback but records no
operation-duration sample.</li>
</ul>
<pre lang="go"><code>rdb := redis.NewClient(&amp;redis.Options{
&lt;/tr&gt;&lt;/table&gt; 
</code></pre>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/redis/go-redis/commit/6f2b2639e563b11709e06f42bc0addbfb5a1abb6"><code>6f2b263</code></a>
chore(release): v9.23.0 (<a
href="https://redirect.github.com/redis/go-redis/issues/4074">#4074</a>)</li>
<li><a
href="https://github.com/redis/go-redis/commit/ec50c6985c4029d8223f004f0e6feda808d5b3c6"><code>ec50c69</code></a>
feat(conn): add DisposableConn to discard on Close (<a
href="https://redirect.github.com/redis/go-redis/issues/4039">#4039</a>)</li>
<li><a
href="https://github.com/redis/go-redis/commit/e3d2548a381bed649926f90cfd177a10a7c6f9f3"><code>e3d2548</code></a>
fix(pool): fix ConnStateMachine waiter races (<a
href="https://redirect.github.com/redis/go-redis/issues/4072">#4072</a>)</li>
<li><a
href="https://github.com/redis/go-redis/commit/2ee6d868bd693705421a7c7b8d28b3e488971660"><code>2ee6d86</code></a>
fix(pool): wake waiters when a connection is released to the pool (<a
href="https://redirect.github.com/redis/go-redis/issues/4028">#4028</a>)</li>
<li><a
href="https://github.com/redis/go-redis/commit/83d45edda6edcb1f954c9ad1e94d506b2530afd3"><code>83d45ed</code></a>
fix:(proto): support uintptr in WriteArg (<a
href="https://redirect.github.com/redis/go-redis/issues/4054">#4054</a>)</li>
<li><a
href="https://github.com/redis/go-redis/commit/c2002af06ccca5d7fc70e873a63e8eda6ca9ed17"><code>c2002af</code></a>
docs(example): add full-duplex examples (<a
href="https://redirect.github.com/redis/go-redis/issues/4061">#4061</a>)</li>
<li><a
href="https://github.com/redis/go-redis/commit/b5f8864de614246957de29c9530a0c25adc90b1c"><code>b5f8864</code></a>
feat(autopipeline): add MaxQueuedCommands hard limit (<a
href="https://redirect.github.com/redis/go-redis/issues/4070">#4070</a>)</li>
<li><a
href="https://github.com/redis/go-redis/commit/89ecbc5a8e24fd0addfa5457e1a983234c9aef52"><code>89ecbc5</code></a>
fix(options): reject invalid skip_verify values in ParseURL (<a
href="https://redirect.github.com/redis/go-redis/issues/4064">#4064</a>)</li>
<li><a
href="https://github.com/redis/go-redis/commit/f813adcb8569821e5bf117af6216163128dc8eca"><code>f813adc</code></a>
feat(autopipeline): run N full-duplex engines on one client (<a
href="https://redirect.github.com/redis/go-redis/issues/4022">#4022</a>)</li>
<li><a
href="https://github.com/redis/go-redis/commit/349bcf47a9c6b144cd26ae4d28e45f41410d89be"><code>349bcf4</code></a>
feat(autopipeline): run Pipeline on the full-duplex connection (<a
href="https://redirect.github.com/redis/go-redis/issues/4021">#4021</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/redis/go-redis/compare/v9.22.0...v9.23.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9&package-manager=go_modules&previous-version=9.22.0&new-version=9.23.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

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 show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants