Repository navigation
Conversation
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 /> [](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><input type="hidden"></code> elements with <code>tabindex=""</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><noscript></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><meta></code> elements, and encoding detection incorrectly using incomplete <code><meta></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>"null"</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><form name="myForm"></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><select></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=""</code>, <code>title=""</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 /> [](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 > 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(&redis.Options{ Addr: "localhost:6379", AutoPipelineOptions: &redis.AutoPipelineOptions{ FullDuplex: true, // stream commands on one held connection, ~1 RTT each }, }) defer rdb.Close() </tr></table> </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 > 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(&redis.Options{ </tr></table> </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 /> [](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>
hltav
requested review from
Benevanio,
nayarakarinesilva and
pedrosilvaadev
as code owners
October 13, 2026 00:53
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.