Dev - #362
Merged
Merged
Conversation
The upstream answers 200 with `location: null` for addresses it cannot place (anycast ranges, bogons), so destructuring it and reading `.city` threw and the whole source returned 500. Guard it the way `asn` already was, and export the normalizer so the degraded shape is covered by tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The engine's queued timers deliver a last measurement after onFinish or onUnmounted already nulled the reference, so updateProgress threw on `testEngine.results`. Match the optional-chaining guard its sibling updateSpeedInRealTime has carried all along. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Seven call sites hand-split trace bodies with the same lines.find +
split("=") pattern; extract utils/parse-trace.js and route them all
through it. The parser trims keys and values, so bodies re-serialized
with CRLF by middleboxes no longer leak a trailing "\r" into the IP.
SpeedTest's invalid-IP throw now carries a self-describing detail
(no-ip-line / empty-value / length + tail charcode) to tell response
tampering apart from format surprises.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… choice The geolocation fallback used to rewrite the stored preference on every successful fallback and disable failing sources for the session, so a transient error changed what the user had picked and struck sources out of the Preferences picker. Now ipDBs.enabled is derived purely from the /api/configs flags the moment they arrive (replacing the 4s timer in Preferences.vue), runtime failures just walk to the next source with a one-time toast, and the stored preference is only rewritten when it points at a source that is no longer configured — migrated to the nearest available one, also announced via toast, in all four locales. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
encodeURIComponent turned IPv6 colons into %3A, which some RIR delegate servers (e.g. IDNIC behind APNIC's redirect) reject with a 400. Colons are legal in a URL path and the guard layer already ensures a well-formed IP, so build the query URL with the literal address. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Shortcuts are for high-frequency actions: remove the Command Line API (x), About (a) and Preferences (p) bindings, and give the share-report dialog the freed-up slot as e (export). The defineExpose hooks and template refs that existed only for the removed bindings go with them; locale descriptions follow in all four languages. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Greptile SummaryThis PR improves resilience and user-facing navigation across IP lookups, documentation tools, and keyboard shortcuts.
Confidence Score: 5/5The PR appears safe to merge, with no concrete blocking or independently actionable non-blocking defects identified. The changed fallback, parser, RDAP, assistant, and shortcut paths are consistently wired to their callers and supported by targeted regression tests, with no reachable incorrect behavior established.
|
| Filename | Overview |
|---|---|
| frontend/components/IpInfos.vue | Adds non-persistent geolocation fallback behavior and user notification while preserving successful result caching. |
| frontend/store.js | Applies backend configuration to IP-source availability and migrates preferences away from unavailable sources. |
| frontend/data/ip-databases.js | Adds source configuration metadata and pure availability/fallback-selection helpers with focused tests. |
| frontend/composables/use-docs-assistant.js | Adds shared assistant open-state management and animation-settling protection for the custom launcher. |
| frontend/components/widgets/DocsAssistant.vue | Replaces the stock GitBook launcher with authenticated custom controls, mobile backdrop handling, and panel-state synchronization. |
| frontend/utils/parse-trace.js | Introduces a shared robust parser for Cloudflare trace responses, including CRLF and embedded-equals handling. |
| common/rdap.js | Preserves IPv6 colons in RDAP request paths to support registries that reject percent-encoded literals. |
| frontend/composables/use-shortcuts.js | Replaces retired component shortcuts with an end-to-end Share Report dialog shortcut. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Application startup] --> B[Load preferences]
A --> C[Fetch backend configuration]
C --> D[Derive available IP databases]
D --> E{Preferred source available?}
E -->|Yes| F[Fetch IP details]
E -->|No| G[Select nearest enabled source]
G --> F
F --> H{Request succeeds?}
H -->|Yes| I[Render and cache IP details]
H -->|No| J[Try next enabled source]
J --> H
Reviews (1): Last reviewed commit: "Improvements" | Re-trigger Greptile
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.