Skip to content

Commit c19b438

Browse files
authored
fix: isolate invalid provider JSON (#2)
1 parent 87a1277 commit c19b438

2 files changed

Lines changed: 39 additions & 16 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Fixed
11+
- **Provider JSON isolation.** Invalid JSON from one provider is now surfaced
12+
as that provider's error instead of breaking the whole Waybar payload. Corrupt
13+
`last.json` cache files are ignored instead of poisoning future refreshes.
14+
1015
## [0.3.0] — 2026-05-31
1116

1217
### Added

codexbar.sh

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -198,51 +198,69 @@ for p in "${PROVIDERS[@]}"; do
198198
i=$((i + 1))
199199
done
200200

201+
append_merged_entry() {
202+
local entry="$1"
203+
[[ -z "$entry" ]] && return
204+
if (( first )); then
205+
merged+="$entry"
206+
first=0
207+
else
208+
merged+=",$entry"
209+
fi
210+
}
211+
201212
merged="["
202213
first=1
203214
for p in "${PROVIDERS[@]}"; do
204215
body="$(cat "$tmpdir/$p.json")"
205216
# CLI returns a JSON array; unwrap and append elements.
206-
if [[ -z "$body" ]] || ! echo "$body" | jq -e 'type == "array"' >/dev/null 2>&1; then
217+
if [[ -z "$body" ]]; then
218+
continue
219+
fi
220+
if ! echo "$body" | jq -e 'type == "array"' >/dev/null 2>&1; then
221+
append_merged_entry "$(jq -cn \
222+
--arg provider "$p" \
223+
--arg message "invalid JSON from provider" \
224+
'{provider: $provider, error: {message: $message}}')"
207225
continue
208226
fi
209227
inner="$(echo "$body" | jq -c '.[]')"
210228
while IFS= read -r entry; do
211-
[[ -z "$entry" ]] && continue
212-
if (( first )); then
213-
merged+="$entry"
214-
first=0
215-
else
216-
merged+=",$entry"
217-
fi
229+
append_merged_entry "$entry"
218230
done <<< "$inner"
219231
done
220232
merged+="]"
221233

234+
last_good_json=""
235+
if [[ -f "$LAST_GOOD" ]]; then
236+
last_good_json="$(jq -c 'select(type == "array")' "$LAST_GOOD" 2>/dev/null || true)"
237+
fi
238+
222239
# Persist fresh successful provider snapshots without dropping older successful
223240
# entries for providers that failed this refresh.
224241
if [[ "$merged" != "[]" ]] && echo "$merged" | jq -e 'any(.error | not)' >/dev/null 2>&1; then
225-
if [[ -f "$LAST_GOOD" ]]; then
226-
merged_for_cache="$(jq -c --argjson prev "$(cat "$LAST_GOOD")" '
242+
if [[ -n "$last_good_json" ]]; then
243+
merged_for_cache="$(jq -c --argjson prev "$last_good_json" '
227244
([$prev[]? | select((.error | not) and (.stale != true))
228245
| {key: .provider, value: .}] | from_entries) as $ok_prev
229246
| ([.[]? | select(.error | not)
230-
| {key: .provider, value: (del(.stale))}] | from_entries) as $ok_fresh
247+
| {key: .provider, value: (del(.stale))}] | from_entries) as $ok_fresh
231248
| ($ok_prev + $ok_fresh) | [.[]]
232249
' <<< "$merged")"
233-
echo "$merged_for_cache" > "$LAST_GOOD"
250+
[[ -n "$merged_for_cache" ]] && echo "$merged_for_cache" > "$LAST_GOOD"
234251
else
235252
echo "$merged" | jq -c 'map(select(.error | not) | del(.stale))' > "$LAST_GOOD"
236253
fi
254+
last_good_json="$(jq -c 'select(type == "array")' "$LAST_GOOD" 2>/dev/null || true)"
237255
fi
238256

239257
# Fill in errored or missing providers with the last successful snapshot for
240-
# display (marks them stale). Missing happens when a provider returns
241-
# empty/invalid output instead of a JSON array.
242-
if [[ -f "$LAST_GOOD" ]]; then
258+
# display (marks them stale). Missing happens when a provider returns empty
259+
# output instead of a JSON array.
260+
if [[ -n "$last_good_json" ]]; then
243261
providers_json="$(printf '%s\n' "${PROVIDERS[@]}" | jq -R . | jq -s .)"
244262
merged="$(jq -c \
245-
--argjson prev "$(cat "$LAST_GOOD")" \
263+
--argjson prev "$last_good_json" \
246264
--argjson requested "$providers_json" '
247265
([$prev[]? | select(.error | not) | {key: .provider, value: .}] | from_entries) as $ok_prev
248266
| (map(.provider) | unique) as $seen

0 commit comments

Comments
 (0)