Skip to content

refactor: adds support for automatic cancellation of unauthorized requests#2491

Merged
stalniy merged 6 commits intomainfrom
refactor/authentication-handling
Jan 15, 2026
Merged

refactor: adds support for automatic cancellation of unauthorized requests#2491
stalniy merged 6 commits intomainfrom
refactor/authentication-handling

Conversation

@stalniy
Copy link
Contributor

@stalniy stalniy commented Jan 14, 2026

Why

If one request to authenticated API fails with 401, we must cancel all in flight requests to the same API, since they will fail with 401 as well and will produce noise in error reporting

Summary by CodeRabbit

  • New Features

    • Circuit-breaker support and option to abort pending HTTP requests on specific responses; configurable fetch adapter and transport selection (fetch/xhr/http).
  • Bug Fixes

    • Retry/backoff now respects Retry-After headers and improved transient/idempotent error classification.
    • Error reporting now ignores aborted (AbortError) requests.
  • Chores

    • Centralized HTTP adapter into shared SDK and replaced axios-retry with Cockatiel.
  • Tests

    • Added tests covering abort/pending-request scenarios.

✏️ Tip: You can customize this high-level summary in your review settings.

@stalniy stalniy requested a review from a team as a code owner January 14, 2026 06:58
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 14, 2026

📝 Walkthrough

Walkthrough

Centralizes a Cockatiel-based fetch adapter into packages/http-sdk, removes the local fetch adapter and axios-retry usage, updates createHttpClient/createAxios signatures and callers to use the shared adapter, adds abort-on-failure behavior, and short-circuits AbortError in the error reporter.

Changes

Cohort / File(s) Summary
HTTP SDK: new public adapter
packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts, packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts, packages/http-sdk/src/index.ts, packages/http-sdk/package.json
Added createFetchAdapter and helpers (Cockatiel-based retries, optional circuit-breaker, abortPendingWhenOneFail, hooks, Retry-After handling), tests, re-export in SDK index, and replaced axios-retry with cockatiel.
HTTP SDK: http client composition
packages/http-sdk/src/utils/httpClient.ts
createHttpClient updated to accept adapter/abort options, composes createFetchAdapter into axios via custom adapter, and updates HttpClientOptions type.
Removed local adapter
apps/deploy-web/src/services/createFetchAdapter/createFetchAdapter.ts
Deleted local fetch adapter module and its public exports (moved into http-sdk).
Fallbackable client & Settings imports
apps/deploy-web/src/services/createFallbackableHttpClient/..., apps/deploy-web/src/context/SettingsProvider/SettingsProviderContext.tsx
Switched imports to @akashnetwork/http-sdk; removed local axios-retry wrapper (removed retries: 0) and rely on SDK adapter.
App DI / createAxios
apps/deploy-web/src/services/app-di-container/app-di-container.ts
createAxios signature changed to accept HttpClientOptions and now delegates to createHttpClient(options); adapter handling moved to SDK.
Server-side clients use http adapter
apps/api/src/core/providers/http-sdk.provider.ts, apps/notifications/src/modules/alert/providers/http-sdk.provider.ts
Providers now pass adapter: "http" to createHttpClient for server-side HTTP clients.
Error handler
apps/deploy-web/src/services/error-handler/error-handler.service.ts
reportError skips processing for AbortError instances (early return).

Sequence Diagram(s)

sequenceDiagram
  participant App as Application (consumer)
  participant DI as DI / app-di-container
  participant SDK as `@akashnetwork/http-sdk`
  participant Policy as Cockatiel Policy Chain
  participant Server as Remote API

  App->>DI: request HttpClient / make request
  DI->>SDK: call createHttpClient(options { adapter, abortPendingWhenOneFail })
  SDK->>Policy: createFetchAdapter(retries, circuitBreaker?, abort predicate)
  App->>SDK: invoke Axios HttpClient (adapter triggers)
  SDK->>Policy: adapter executes (apply retry/circuit-breaker & abort logic)
  Policy->>Server: perform network call (fetch/http adapter)
  Server-->>Policy: response or error
  Policy-->>SDK: onSuccess/onFailure (may abort pending requests)
  SDK-->>App: return AxiosResponse or throw error
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • ygrishajev
  • baktun14

Poem

🐇 I hopped through modules, stitched a shared nest,
Cockatiel hums and retries do their best,
Abort stale hops, let fresh requests take flight,
One adapter now keeps our calls polite,
🥕 Tiny paws, tidy HTTP delight.

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main objective of the PR: adding automatic cancellation of unauthorized requests when a 401 response is received.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings


📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 76773f1 and 1062b56.

📒 Files selected for processing (1)
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursor/rules/general.mdc)

**/*.{ts,tsx,js}: Never use type any or cast to type any. Always define the proper TypeScript types.
Never use deprecated methods from libraries.
Don't add unnecessary comments to the code.

Files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
🧠 Learnings (2)
📓 Common learnings
Learnt from: ygrishajev
Repo: akash-network/console PR: 2254
File: apps/api/test/functional/sign-and-broadcast-tx.spec.ts:4-4
Timestamp: 2025-11-19T15:15:07.283Z
Learning: In the Akash Network Console project, when tests use native Node.js fetch (available in Node 18+), fetch-mock should be used for HTTP mocking instead of nock, as nock does not support intercepting native fetch calls. This applies to apps/api/test/functional/sign-and-broadcast-tx.spec.ts and any other tests using native fetch.
Learnt from: jzsfkzm
Repo: akash-network/console PR: 1372
File: apps/api/src/dashboard/services/stats/stats.service.ts:0-0
Timestamp: 2025-05-28T20:42:58.200Z
Learning: The user successfully implemented CosmosHttpService with retry logic using axiosRetry, exponential backoff, and proper error handling for Cosmos API calls, replacing direct axios usage in StatsService.
📚 Learning: 2025-11-19T15:15:07.283Z
Learnt from: ygrishajev
Repo: akash-network/console PR: 2254
File: apps/api/test/functional/sign-and-broadcast-tx.spec.ts:4-4
Timestamp: 2025-11-19T15:15:07.283Z
Learning: In the Akash Network Console project, when tests use native Node.js fetch (available in Node 18+), fetch-mock should be used for HTTP mocking instead of nock, as nock does not support intercepting native fetch calls. This applies to apps/api/test/functional/sign-and-broadcast-tx.spec.ts and any other tests using native fetch.

Applied to files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (12)
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: Validate local packages
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (6)
packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts (6)

6-17: Well-typed options interface.

The interface cleanly exposes retry, circuit breaker, and abort behavior configuration with proper TypeScript types.


20-76: Solid implementation with past review feedback addressed.

The retry and circuit breaker policies are well-composed. The ?? operators correctly handle explicit 0 values for retries and maxAttempts, and the Retry-After date parsing now guards against past dates with the > Date.now() check.

One minor observation: Line 68 casts config.signal as AbortSignal, but config.signal can be undefined. Cockatiel's execute() accepts an optional signal, so this works, but the cast is slightly misleading.


78-82: Clear error classification logic.

The function correctly distinguishes between non-Axios network errors (checking for specific error codes) and Axios errors (checking for idempotent request conditions).


84-88: LGTM!

The retriable error codes cover common transient network failures appropriately.


90-98: LGTM!

The idempotent request error detection correctly identifies methods safe to retry and appropriate HTTP status codes (429, 5xx) that warrant retry attempts.


100-117: AbortSignal.any() is fully compatible with this project.

The project requires Node.js 24.11.1 (per package.json engines), which is well above the minimum version (20.3.0) where AbortSignal.any() was introduced. No compatibility concerns or polyfills are needed.

The abort-and-reinitialize pattern on lines 111-112 is correct for coordinating cancellation across in-flight requests.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov
Copy link

codecov bot commented Jan 14, 2026

Codecov Report

❌ Patch coverage is 80.00000% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 50.88%. Comparing base (8f3383d) to head (1062b56).
⚠️ Report is 1 commits behind head on main.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
apps/api/src/core/providers/http-sdk.provider.ts 50.00% 1 Missing ⚠️
...rc/services/error-handler/error-handler.service.ts 50.00% 1 Missing ⚠️

❌ Your patch status has failed because the patch coverage (50.00%) is below the target coverage (80.00%). You can increase the patch coverage or adjust the target coverage.
❌ Your project status has failed because the head coverage (79.31%) is below the target coverage (80.00%). You can increase the head coverage or adjust the target coverage.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2491      +/-   ##
==========================================
- Coverage   50.95%   50.88%   -0.07%     
==========================================
  Files        1064     1063       -1     
  Lines       29457    29417      -40     
  Branches     6530     6494      -36     
==========================================
- Hits        15010    14970      -40     
+ Misses      14100    14037      -63     
- Partials      347      410      +63     
Flag Coverage Δ
api 79.31% <50.00%> (-0.03%) ⬇️
deploy-web 31.34% <85.71%> (-0.15%) ⬇️
log-collector 75.35% <ø> (ø)
notifications 87.94% <100.00%> (ø)
provider-console 81.48% <ø> (ø)
provider-proxy 84.35% <ø> (ø)
Files with missing lines Coverage Δ
...ntext/SettingsProvider/SettingsProviderContext.tsx 11.30% <100.00%> (ø)
.../src/services/app-di-container/app-di-container.ts 76.03% <100.00%> (-0.64%) ⬇️
...backableHttpClient/createFallbackableHttpClient.ts 100.00% <100.00%> (ø)
...s/src/modules/alert/providers/http-sdk.provider.ts 100.00% <100.00%> (ø)
apps/api/src/core/providers/http-sdk.provider.ts 94.44% <50.00%> (ø)
...rc/services/error-handler/error-handler.service.ts 91.83% <50.00%> (-1.65%) ⬇️

... and 50 files with indirect coverage changes

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@stalniy stalniy force-pushed the refactor/authentication-handling branch from 0357b64 to 1880868 Compare January 14, 2026 07:15
ygrishajev
ygrishajev previously approved these changes Jan 14, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts`:
- Around line 282-320: The test mixing jest.useFakeTimers() with
timers/promises.wait in the createFetchAdapter.spec (the adapter mock uses wait
with config.signal) is fragile because it never advances fake timers; update the
test that aborts pending requests ("aborts all pending requests when one request
fails with matching condition") to call await jest.runAllTimersAsync() at
appropriate points (for example after initiating the two fetch calls and before
awaiting Promise.allSettled) so the fake timers advance and the wait() resolves
or the abort is processed deterministically; alternatively, refactor the test to
avoid timers/promises.wait (e.g., use a controllable Promise or manual
resolve/reject and trigger aborts) while keeping the references to
createFetchAdapter, adapter, abortPendingWhenOneFail, and wait.
🧹 Nitpick comments (3)
packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts (2)

313-319: Consider type-safe extraction instead of as unknown as casts.

The double cast through unknown works but is a pattern that can mask type issues. Consider a type guard or assertion function for cleaner extraction.

♻️ Suggested improvement
-      expect(pendingResult.status).toBe("rejected");
-      const abortError = (pendingResult as unknown as PromiseRejectedResult).reason;
-      expect(abortError.name).toBe("AbortError");
-
-      expect(failingResult.status).toBe("rejected");
-      const error = (failingResult as unknown as PromiseRejectedResult).reason;
-      expect(error.response?.status).toBe(401);
+      expect(pendingResult.status).toBe("rejected");
+      if (pendingResult.status === "rejected") {
+        expect(pendingResult.reason.name).toBe("AbortError");
+      }
+
+      expect(failingResult.status).toBe("rejected");
+      if (failingResult.status === "rejected") {
+        expect(failingResult.reason.response?.status).toBe(401);
+      }

391-411: Test verifies signal wrapping but not external abort propagation.

This test confirms the signal is replaced with a composed signal, but doesn't verify that aborting externalAbortController would still cancel the request. Consider adding a test case that aborts the external controller mid-request to ensure both signals are respected.

packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts (1)

62-69: Potential issue with undefined signal cast.

Line 64 casts config.signal as AbortSignal, but config.signal may be undefined. While cockatiel's execute() likely accepts undefined, the explicit cast could mask type issues.

♻️ Suggested improvement
-      .execute(() => fetchAdapter(config), config.signal as AbortSignal)
+      .execute(() => fetchAdapter(config), config.signal ?? undefined)

Or simply pass without casting if cockatiel accepts AbortSignal | undefined:

-      .execute(() => fetchAdapter(config), config.signal as AbortSignal)
+      .execute(() => fetchAdapter(config), config.signal)
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1880868 and ffc28b2.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (10)
  • apps/deploy-web/src/context/SettingsProvider/SettingsProviderContext.tsx
  • apps/deploy-web/src/services/app-di-container/app-di-container.ts
  • apps/deploy-web/src/services/createFallbackableHttpClient/createFallbackableHttpClient.ts
  • apps/deploy-web/src/services/createFetchAdapter/createFetchAdapter.ts
  • apps/deploy-web/src/services/error-handler/error-handler.service.ts
  • packages/http-sdk/package.json
  • packages/http-sdk/src/index.ts
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
  • packages/http-sdk/src/utils/httpClient.ts
💤 Files with no reviewable changes (1)
  • apps/deploy-web/src/services/createFetchAdapter/createFetchAdapter.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • apps/deploy-web/src/services/error-handler/error-handler.service.ts
  • apps/deploy-web/src/services/app-di-container/app-di-container.ts
  • packages/http-sdk/package.json
  • apps/deploy-web/src/context/SettingsProvider/SettingsProviderContext.tsx
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursor/rules/general.mdc)

**/*.{ts,tsx,js}: Never use type any or cast to type any. Always define the proper TypeScript types.
Never use deprecated methods from libraries.
Don't add unnecessary comments to the code.

Files:

  • apps/deploy-web/src/services/createFallbackableHttpClient/createFallbackableHttpClient.ts
  • packages/http-sdk/src/index.ts
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
  • packages/http-sdk/src/utils/httpClient.ts
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
**/*.spec.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/no-jest-mock.mdc)

Don't use jest.mock() in test files. Instead, use jest-mock-extended to create mocks and pass mocks as dependencies to the service under test

Use setup function instead of beforeEach in test files. The setup function must be at the bottom of the root describe block, should create an object under test and return it, accept a single parameter with inline type definition, avoid shared state, and not have a specified return type.

**/*.spec.{ts,tsx}: Use <Subject>.name in the root describe suite description instead of hardcoded class/service name strings to enable automated refactoring tools to find all references
Use either a method name or a condition starting with 'when' for nested suite descriptions in tests
Use present simple, 3rd person singular for test descriptions without prepending 'should'

Files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
**/*.{test,spec}.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use setup function instead of beforeEach in unit and service level tests

Files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
🧠 Learnings (3)
📓 Common learnings
Learnt from: baktun14
Repo: akash-network/console PR: 1725
File: apps/api/src/utils/constants.ts:5-5
Timestamp: 2025-07-24T17:00:52.361Z
Learning: In the Akash Network Console project, when cross-cutting concerns or broader refactoring issues are identified during PR review, the preferred approach is to create a separate GitHub issue to track the work rather than expanding the scope of the current PR. This maintains focus and allows for proper planning of architectural improvements.
Learnt from: ygrishajev
Repo: akash-network/console PR: 2254
File: apps/api/test/functional/sign-and-broadcast-tx.spec.ts:4-4
Timestamp: 2025-11-19T15:15:07.283Z
Learning: In the Akash Network Console project, when tests use native Node.js fetch (available in Node 18+), fetch-mock should be used for HTTP mocking instead of nock, as nock does not support intercepting native fetch calls. This applies to apps/api/test/functional/sign-and-broadcast-tx.spec.ts and any other tests using native fetch.
Learnt from: jzsfkzm
Repo: akash-network/console PR: 1372
File: apps/api/src/dashboard/services/stats/stats.service.ts:0-0
Timestamp: 2025-05-28T20:42:58.200Z
Learning: The user successfully implemented CosmosHttpService with retry logic using axiosRetry, exponential backoff, and proper error handling for Cosmos API calls, replacing direct axios usage in StatsService.
📚 Learning: 2025-11-19T15:15:07.283Z
Learnt from: ygrishajev
Repo: akash-network/console PR: 2254
File: apps/api/test/functional/sign-and-broadcast-tx.spec.ts:4-4
Timestamp: 2025-11-19T15:15:07.283Z
Learning: In the Akash Network Console project, when tests use native Node.js fetch (available in Node 18+), fetch-mock should be used for HTTP mocking instead of nock, as nock does not support intercepting native fetch calls. This applies to apps/api/test/functional/sign-and-broadcast-tx.spec.ts and any other tests using native fetch.

Applied to files:

  • apps/deploy-web/src/services/createFallbackableHttpClient/createFallbackableHttpClient.ts
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
📚 Learning: 2025-05-28T20:42:58.200Z
Learnt from: jzsfkzm
Repo: akash-network/console PR: 1372
File: apps/api/src/dashboard/services/stats/stats.service.ts:0-0
Timestamp: 2025-05-28T20:42:58.200Z
Learning: The user successfully implemented CosmosHttpService with retry logic using axiosRetry, exponential backoff, and proper error handling for Cosmos API calls, replacing direct axios usage in StatsService.

Applied to files:

  • apps/deploy-web/src/services/createFallbackableHttpClient/createFallbackableHttpClient.ts
  • packages/http-sdk/src/utils/httpClient.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (13)
  • GitHub Check: validate (apps/stats-web) / validate-unsafe
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: Validate local packages
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (9)
apps/deploy-web/src/services/createFallbackableHttpClient/createFallbackableHttpClient.ts (2)

1-3: LGTM - Import centralization is clean.

Moving imports from local path to @akashnetwork/http-sdk aligns with the PR's goal of centralizing the fetch adapter.


17-23: No changes needed. The custom IBreaker implementation is type-safe and correctly compatible with cockatiel's interface. TypeScript validation passes without errors, and the code is already unit tested.

packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts (4)

6-17: LGTM - Well-typed options interface.

The FetchAdapterOptions interface provides flexible configuration for retries, circuit breaker, and the new abort functionality.


74-78: LGTM - Clear error classification logic.

The function correctly distinguishes between network-level errors (connection refused, reset, etc.) and HTTP-level errors, applying appropriate retry logic to each.


86-94: LGTM - Correct idempotent request error handling.

The logic correctly identifies retriable errors for idempotent HTTP methods, excluding user-initiated aborts and only retrying on transient failures (rate limits, server errors, network issues).


96-113: No action needed. The project explicitly requires Node 24.11.1+ (via engines in root package.json), which fully supports AbortSignal.any() (available in Node 20.3+). Since http-sdk is a Node.js library targeting the server environment, browser compatibility is not a concern. A polyfill is unnecessary.

Likely an incorrect or invalid review comment.

packages/http-sdk/src/index.ts (1)

28-28: LGTM - Clean public API expansion.

The new exports properly expose the fetch adapter factory and its associated types, enabling consumers to configure and use the adapter directly.

packages/http-sdk/src/utils/httpClient.ts (2)

6-12: LGTM - Clean adapter integration.

The destructuring pattern cleanly separates adapter-specific options from axios config, and the adapter is properly created with the abort functionality.


25-26: LGTM - Type extension is correct.

The HttpClientOptions type properly extends axios defaults with the new abort predicate option.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

@stalniy stalniy force-pushed the refactor/authentication-handling branch from ffc28b2 to 8a0f4c8 Compare January 14, 2026 14:21
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/api/src/core/providers/http-sdk.provider.ts (1)

32-37: Inconsistency: SERVICES bypass the standardized adapter.

BalanceHttpService, BidHttpService, and ProviderHttpService are instantiated directly with only { baseURL }, bypassing createHttpClient and the new adapter configuration with retry/circuit-breaker logic.

Unlike NON_AXIOS_SERVICES (which receive CHAIN_API_HTTP_CLIENT created via createHttpClient), these services are plain Axios instances without the fetch adapter. Consider refactoring them to accept an HttpClient dependency like the NON_AXIOS_SERVICES pattern, or add a comment explaining why they intentionally skip the standardized adapter.

🤖 Fix all issues with AI agents
In `@packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts`:
- Line 36: The assignment for maxAttempts incorrectly uses the || operator which
treats 0 as falsy and overrides an explicit retries: 0; update the expression in
createFetchAdapter so maxAttempts: options.retries ?? 3 (use the nullish
coalescing operator) so that undefined/null fall back to 3 but 0 is respected;
locate the maxAttempts setting where options.retries is referenced and replace
|| with ??.
- Line 28: The breaker initialization uses a fallthrough operator that treats
explicit 0 as falsy; update the maxAttempts fallback to use nullish coalescing
so an explicit 0 is honored: in the breaker property (the object key that
constructs a new ConsecutiveBreaker) replace the use of || for
options.circuitBreaker?.maxAttempts with ?? so it passes
options.circuitBreaker?.maxAttempts ?? 1 into the ConsecutiveBreaker
constructor; leave the rest (the breaker property and ConsecutiveBreaker usage)
unchanged.
🧹 Nitpick comments (3)
packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts (1)

391-411: Consider strengthening the signal preservation test.

The test verifies that the passed signal is replaced with an internal one, but it doesn't verify that aborting the external controller still propagates correctly. Consider adding an assertion that the external abort signal's abort event still triggers the request cancellation.

💡 Suggested enhancement
it("aborts when external signal is aborted", async () => {
  const externalAbortController = new AbortController();
  const adapter = jest.fn().mockImplementation(async (config: InternalAxiosRequestConfig) => {
    await wait(100, undefined, { signal: config.signal as AbortSignal });
    return { status: 200, data: "success" };
  });

  const fetch = createFetchAdapter({
    adapter,
    abortPendingWhenOneFail: response => response.status === 401,
    retries: 1
  });

  const requestPromise = fetch({ method: "GET", url: "/test", headers: new AxiosHeaders(), signal: externalAbortController.signal });
  externalAbortController.abort();

  await expect(requestPromise).rejects.toThrow();
});
packages/http-sdk/src/utils/httpClient.ts (1)

8-9: Consider making retries configurable.

The retry count is hardcoded to 3. While this is a reasonable default, exposing it via HttpClientOptions would provide flexibility for consumers with different retry requirements.

💡 Suggested enhancement
 export type HttpClientOptions = Omit<CreateAxiosDefaults, "adapter"> & {
   /** `@default` 'fetch' */
   adapter?: "fetch" | "xhr" | "http" | AxiosAdapter;
   abortPendingWhenOneFail?: (response: AxiosResponse) => boolean;
+  /** `@default` 3 */
+  retries?: number;
 };
 export function createHttpClient(fullConfig: HttpClientOptions = {}): HttpClient {
-  const { abortPendingWhenOneFail, adapter, ...config } = fullConfig;
+  const { abortPendingWhenOneFail, adapter, retries = 3, ...config } = fullConfig;
   const customAdapter = createFetchAdapter({
-    retries: 3,
+    retries,
     adapter: typeof adapter === "function" ? adapter : axios.getAdapter(adapter || "fetch"),
     abortPendingWhenOneFail
   });
packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts (1)

64-64: Unnecessary cast when config.signal may be undefined.

Cockatiel's execute accepts an optional AbortSignal, so the cast is misleading. Passing undefined is valid.

Suggested fix
-      .execute(() => fetchAdapter(config), config.signal as AbortSignal)
+      .execute(() => fetchAdapter(config), config.signal)
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ffc28b2 and 8a0f4c8.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (12)
  • apps/api/src/core/providers/http-sdk.provider.ts
  • apps/deploy-web/src/context/SettingsProvider/SettingsProviderContext.tsx
  • apps/deploy-web/src/services/app-di-container/app-di-container.ts
  • apps/deploy-web/src/services/createFallbackableHttpClient/createFallbackableHttpClient.ts
  • apps/deploy-web/src/services/createFetchAdapter/createFetchAdapter.ts
  • apps/deploy-web/src/services/error-handler/error-handler.service.ts
  • apps/notifications/src/modules/alert/providers/http-sdk.provider.ts
  • packages/http-sdk/package.json
  • packages/http-sdk/src/index.ts
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
  • packages/http-sdk/src/utils/httpClient.ts
💤 Files with no reviewable changes (1)
  • apps/deploy-web/src/services/createFetchAdapter/createFetchAdapter.ts
🚧 Files skipped from review as they are similar to previous changes (5)
  • apps/deploy-web/src/services/app-di-container/app-di-container.ts
  • apps/deploy-web/src/services/createFallbackableHttpClient/createFallbackableHttpClient.ts
  • packages/http-sdk/package.json
  • apps/deploy-web/src/services/error-handler/error-handler.service.ts
  • packages/http-sdk/src/index.ts
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursor/rules/general.mdc)

**/*.{ts,tsx,js}: Never use type any or cast to type any. Always define the proper TypeScript types.
Never use deprecated methods from libraries.
Don't add unnecessary comments to the code.

Files:

  • packages/http-sdk/src/utils/httpClient.ts
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
  • apps/api/src/core/providers/http-sdk.provider.ts
  • apps/notifications/src/modules/alert/providers/http-sdk.provider.ts
  • apps/deploy-web/src/context/SettingsProvider/SettingsProviderContext.tsx
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
**/*.spec.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/no-jest-mock.mdc)

Don't use jest.mock() in test files. Instead, use jest-mock-extended to create mocks and pass mocks as dependencies to the service under test

Use setup function instead of beforeEach in test files. The setup function must be at the bottom of the root describe block, should create an object under test and return it, accept a single parameter with inline type definition, avoid shared state, and not have a specified return type.

**/*.spec.{ts,tsx}: Use <Subject>.name in the root describe suite description instead of hardcoded class/service name strings to enable automated refactoring tools to find all references
Use either a method name or a condition starting with 'when' for nested suite descriptions in tests
Use present simple, 3rd person singular for test descriptions without prepending 'should'

Files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
**/*.{test,spec}.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use setup function instead of beforeEach in unit and service level tests

Files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
🧠 Learnings (7)
📓 Common learnings
Learnt from: baktun14
Repo: akash-network/console PR: 1725
File: apps/api/src/utils/constants.ts:5-5
Timestamp: 2025-07-24T17:00:52.361Z
Learning: In the Akash Network Console project, when cross-cutting concerns or broader refactoring issues are identified during PR review, the preferred approach is to create a separate GitHub issue to track the work rather than expanding the scope of the current PR. This maintains focus and allows for proper planning of architectural improvements.
Learnt from: jzsfkzm
Repo: akash-network/console PR: 1372
File: apps/api/src/dashboard/services/stats/stats.service.ts:0-0
Timestamp: 2025-05-28T20:42:58.200Z
Learning: The user successfully implemented CosmosHttpService with retry logic using axiosRetry, exponential backoff, and proper error handling for Cosmos API calls, replacing direct axios usage in StatsService.
📚 Learning: 2025-05-28T20:42:58.200Z
Learnt from: jzsfkzm
Repo: akash-network/console PR: 1372
File: apps/api/src/dashboard/services/stats/stats.service.ts:0-0
Timestamp: 2025-05-28T20:42:58.200Z
Learning: The user successfully implemented CosmosHttpService with retry logic using axiosRetry, exponential backoff, and proper error handling for Cosmos API calls, replacing direct axios usage in StatsService.

Applied to files:

  • packages/http-sdk/src/utils/httpClient.ts
📚 Learning: 2025-11-19T15:15:07.283Z
Learnt from: ygrishajev
Repo: akash-network/console PR: 2254
File: apps/api/test/functional/sign-and-broadcast-tx.spec.ts:4-4
Timestamp: 2025-11-19T15:15:07.283Z
Learning: In the Akash Network Console project, when tests use native Node.js fetch (available in Node 18+), fetch-mock should be used for HTTP mocking instead of nock, as nock does not support intercepting native fetch calls. This applies to apps/api/test/functional/sign-and-broadcast-tx.spec.ts and any other tests using native fetch.

Applied to files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
  • apps/deploy-web/src/context/SettingsProvider/SettingsProviderContext.tsx
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
📚 Learning: 2025-11-25T17:45:52.965Z
Learnt from: CR
Repo: akash-network/console PR: 0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-11-25T17:45:52.965Z
Learning: Applies to **/*.spec.{ts,tsx} : Use `setup` function instead of `beforeEach` in test files. The `setup` function must be at the bottom of the root `describe` block, should create an object under test and return it, accept a single parameter with inline type definition, avoid shared state, and not have a specified return type.

Applied to files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
📚 Learning: 2025-11-25T17:45:44.790Z
Learnt from: CR
Repo: akash-network/console PR: 0
File: .cursor/rules/no-jest-mock.mdc:0-0
Timestamp: 2025-11-25T17:45:44.790Z
Learning: Applies to **/*.spec.{ts,tsx} : Don't use `jest.mock()` in test files. Instead, use `jest-mock-extended` to create mocks and pass mocks as dependencies to the service under test

Applied to files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
📚 Learning: 2026-01-13T17:40:26.436Z
Learnt from: CR
Repo: akash-network/console PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-13T17:40:26.436Z
Learning: Applies to **/*.{test,spec}.{ts,tsx,js,jsx} : Use `setup` function instead of `beforeEach` in unit and service level tests

Applied to files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
📚 Learning: 2025-10-31T11:26:42.138Z
Learnt from: stalniy
Repo: akash-network/console PR: 2138
File: apps/api/src/billing/lib/batch-signing-client/batch-signing-client.service.ts:379-382
Timestamp: 2025-10-31T11:26:42.138Z
Learning: In TypeScript/JavaScript, the pattern of checking a cached value and then performing an async operation to fetch it without proper synchronization is race condition unsafe:
```typescript
private async getAddress() {
  if (!this.address) {
    this.address = await this.wallet.getFirstAddress();
  }
  return this.address;
}
```
Multiple concurrent calls can all pass the `if (!this.address)` check before any of them sets the value, leading to duplicate async operations. This should be flagged as a race condition. Proper synchronization (mutex, atomic promise caching, or guaranteed single-threaded execution) is required.

Applied to files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts
🧬 Code graph analysis (2)
packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts (2)
packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts (1)
  • createFetchAdapter (20-72)
packages/http-sdk/src/index.ts (1)
  • createFetchAdapter (28-28)
apps/api/src/core/providers/http-sdk.provider.ts (4)
packages/http-sdk/src/coin-gecko/coin-gecko-http.service.ts (1)
  • CoinGeckoHttpService (4-11)
packages/http-sdk/src/utils/httpClient.ts (1)
  • createHttpClient (6-24)
packages/http-sdk/src/index.ts (1)
  • createHttpClient (27-27)
packages/http-sdk/src/node/node-http.service.ts (1)
  • NodeHttpService (16-31)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (18)
  • GitHub Check: validate (apps/provider-console) / validate-unsafe
  • GitHub Check: validate (apps/stats-web) / validate-unsafe
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: Validate local packages
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (21)
apps/notifications/src/modules/alert/providers/http-sdk.provider.ts (2)

14-18: LGTM!

The factory correctly passes adapter: "http" to createHttpClient, aligning with the standardized HTTP adapter configuration across the codebase.


30-34: Inconsistency: BalanceHttpService bypasses the standardized adapter.

Unlike the other services that use CHAIN_API_HTTP_CLIENT_TOKEN (which now includes adapter: "http"), BalanceHttpService is instantiated directly with only baseURL. This means it won't use the centralized fetch adapter with retry/circuit-breaker logic.

Is this intentional? If BalanceHttpService should also use the standardized adapter, consider refactoring it to accept an HttpClient like the other services.

apps/deploy-web/src/context/SettingsProvider/SettingsProviderContext.tsx (3)

3-3: LGTM!

Import correctly consolidated from a local path to the centralized @akashnetwork/http-sdk package.


55-59: LGTM!

The fetch adapter is correctly instantiated at module level with a 5-second halfOpenAfter circuit breaker configuration, which is appropriate for node status polling operations.


192-195: LGTM!

The fetchAdapter is correctly passed to the HTTP client for status requests, enabling the circuit breaker behavior for unreliable node endpoints.

packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.spec.ts (5)

8-15: Timer setup using beforeEach/afterEach is acceptable here.

While coding guidelines prefer setup functions over beforeEach, this usage is appropriate since it's configuring Jest's timer environment rather than creating test subjects. The setup pattern is meant for object instantiation and dependency injection.


191-196: LGTM!

The circuit breaker test now explicitly configures maxAttempts: 1, making the test behavior more deterministic and self-documenting.


282-320: Well-structured abort test.

The test correctly validates the abort behavior by:

  1. Using staggered delays (i * 100) to ensure predictable ordering
  2. Verifying both the aborted request (AbortError) and the triggering request (401 status)
  3. Using Promise.allSettled to capture both outcomes

The wait() call with config.signal ensures the abort signal properly cancels pending waits, which is the intended behavior.


322-354: LGTM!

The test correctly verifies that the adapter allows subsequent requests after an abort scenario, confirming the abort controller is reset appropriately.


356-389: LGTM!

Good negative test case verifying that requests are not aborted when the failure condition (401) doesn't match (400 in this case).

apps/api/src/core/providers/http-sdk.provider.ts (3)

23-30: LGTM!

The CHAIN_API_HTTP_CLIENT factory correctly passes adapter: "http" to createHttpClient, enabling the Node.js HTTP adapter for server-side requests.


51-53: LGTM!

CoinGeckoHttpService now uses createHttpClient with adapter: "http", ensuring consistent HTTP handling for external API calls.


54-58: LGTM!

NodeHttpService now uses createHttpClient with adapter: "http", aligning with the standardized adapter configuration.

packages/http-sdk/src/utils/httpClient.ts (3)

1-4: LGTM!

Clean import restructuring, replacing axios-retry dependency with the local createFetchAdapter that provides equivalent retry functionality via Cockatiel.


6-12: LGTM!

The adapter selection logic correctly handles both custom AxiosAdapter functions and string-based adapter names, with "fetch" as the sensible default.


27-31: LGTM!

Well-defined type with proper JSDoc default annotation. The adapter union type covers all standard axios adapters plus custom implementations.

packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts (5)

74-78: LGTM!

The function correctly distinguishes between network errors (with retriable codes) and Axios errors (checking idempotency). The logic handles both error categories appropriately.


80-84: LGTM!

Covers the standard Node.js network error codes for retriable scenarios.


86-94: LGTM!

Correctly identifies idempotent HTTP methods and appropriate retry conditions (429 rate-limit, 5xx server errors, network errors), while excluding explicitly aborted connections.


96-113: LGTM!

The abort propagation logic correctly combines request-level and adapter-level abort signals. The pattern of resetting the controller after abort ensures subsequent requests aren't affected.


100-100: No action needed. AbortSignal.any() is fully supported in this project. The codebase targets Node 24.11.1 minimum (per root package.json engines), which includes the API introduced in Node 20.0.0. The type assertion to AbortSignal (not any) is appropriate and follows the coding guidelines.

Likely an incorrect or invalid review comment.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

@stalniy stalniy force-pushed the refactor/authentication-handling branch 2 times, most recently from c7cdadf to 43592ee Compare January 14, 2026 14:30
baktun14
baktun14 previously approved these changes Jan 14, 2026
@stalniy stalniy force-pushed the refactor/authentication-handling branch from 43592ee to 41f61cb Compare January 15, 2026 05:51
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts`:
- Around line 49-52: The code computes a potentially negative delay from the
Retry-After header and passes it into ConstantBackoff; update the logic in
createFetchAdapter to clamp the computed delay to zero or positive before
constructing ConstantBackoff (e.g., compute delay = Math.max(0,
retryAfterDate.getTime() - Date.now() + EXTRA_RETRY_AFTER_DELAY)) and use that
clamped delay when creating new ConstantBackoff(...).next(); reference
retryAfterDate, EXTRA_RETRY_AFTER_DELAY, and ConstantBackoff to locate the
change.
♻️ Duplicate comments (2)
packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts (2)

28-29: Same || issue with halfOpenAfter on line 29.

The || operator on line 29 treats 0 as falsy. While halfOpenAfter: 0 may be an edge case, using ?? maintains consistency with the fix needed for maxAttempts on the same line.

Note: The maxAttempts issue on line 28 was already flagged in a previous review.

Suggested fix
-        breaker: options.circuitBreaker?.breaker ?? new ConsecutiveBreaker(options.circuitBreaker?.maxAttempts ?? 1),
-        halfOpenAfter: options.circuitBreaker?.halfOpenAfter || 15 * 1000
+        breaker: options.circuitBreaker?.breaker ?? new ConsecutiveBreaker(options.circuitBreaker?.maxAttempts ?? 1),
+        halfOpenAfter: options.circuitBreaker?.halfOpenAfter ?? 15 * 1000

38-38: Already flagged: || treats explicit 0 as falsy.

This was previously identified in an earlier review. Use ?? to respect explicit retries: 0.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 41f61cb and 313f241.

📒 Files selected for processing (1)
  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursor/rules/general.mdc)

**/*.{ts,tsx,js}: Never use type any or cast to type any. Always define the proper TypeScript types.
Never use deprecated methods from libraries.
Don't add unnecessary comments to the code.

Files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
🧠 Learnings (2)
📓 Common learnings
Learnt from: baktun14
Repo: akash-network/console PR: 1725
File: apps/api/src/utils/constants.ts:5-5
Timestamp: 2025-07-24T17:00:52.361Z
Learning: In the Akash Network Console project, when cross-cutting concerns or broader refactoring issues are identified during PR review, the preferred approach is to create a separate GitHub issue to track the work rather than expanding the scope of the current PR. This maintains focus and allows for proper planning of architectural improvements.
Learnt from: ygrishajev
Repo: akash-network/console PR: 2254
File: apps/api/test/functional/sign-and-broadcast-tx.spec.ts:4-4
Timestamp: 2025-11-19T15:15:07.283Z
Learning: In the Akash Network Console project, when tests use native Node.js fetch (available in Node 18+), fetch-mock should be used for HTTP mocking instead of nock, as nock does not support intercepting native fetch calls. This applies to apps/api/test/functional/sign-and-broadcast-tx.spec.ts and any other tests using native fetch.
📚 Learning: 2025-11-19T15:15:07.283Z
Learnt from: ygrishajev
Repo: akash-network/console PR: 2254
File: apps/api/test/functional/sign-and-broadcast-tx.spec.ts:4-4
Timestamp: 2025-11-19T15:15:07.283Z
Learning: In the Akash Network Console project, when tests use native Node.js fetch (available in Node 18+), fetch-mock should be used for HTTP mocking instead of nock, as nock does not support intercepting native fetch calls. This applies to apps/api/test/functional/sign-and-broadcast-tx.spec.ts and any other tests using native fetch.

Applied to files:

  • packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (15)
  • GitHub Check: codecov/patch/deploy-web
  • GitHub Check: validate (apps/api) / validate-unsafe
  • GitHub Check: validate (packages) / validate-unsafe
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: test-build
  • GitHub Check: Validate local packages
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (3)
packages/http-sdk/src/utils/createFetchAdapter/createFetchAdapter.ts (3)

100-117: LGTM on abort propagation logic.

The abortableAdapter correctly combines request-level and adapter-level abort signals, aborts all in-flight requests when the predicate triggers, and resets the controller for subsequent requests.


78-98: LGTM on error classification helpers.

The isNetworkOrIdempotentRequestError, isRetriableError, and isIdempotentRequestError functions correctly classify retriable errors based on network conditions and idempotent HTTP methods.


103-107: Verify minimum browser version requirements for AbortSignal.any() usage.

AbortSignal.any() was added in Node.js 20+ (already satisfied by ^24.11.1), but browser support requires Chrome 116+, Firefox 124+, and Safari 17.4+. The project has no .browserslistrc or explicit browser version documentation. While the modern tech stack suggests modern browser targets, confirm that the minimum supported browser versions align with AbortSignal.any() availability, or add a fallback/polyfill if older browser support is required.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

@stalniy stalniy merged commit 4c0db77 into main Jan 15, 2026
66 of 68 checks passed
@stalniy stalniy deleted the refactor/authentication-handling branch January 15, 2026 09:29
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.

3 participants

Comments