fix: concurrent cache miss, SVG output, narrowed error handling, format

- Fix integration data cache: check pending promise before TTL to
  prevent returning undefined on concurrent cold-cache access
- Add concurrent-miss test (two parallel callers, one fetch)
- SVG sanitizer: extract <svg> from DOMPurify output to strip
  residual HTML wrapper
- Narrow safeRevalidateTag catch: log unexpected errors, silence only
  known "outside request scope" messages
- Run oxfmt across all packages (206 files formatted)
This commit is contained in:
Thomas Camlong committed 2026-08-07 20:48:17 +02:00
1 parent b81b90875f
commit 38ac8f3075
206 files changed
+7952 -6722

No files matched your search

+4 -3
View File
@@ -36,15 +36,16 @@ const integrationLoaders: Record<IntegrationKind, IntegrationLoader> = {
nextcloud: () => import("../nextcloud/nextcloud.integration").then((m) => m.NextcloudIntegration),
ntfy: () => import("../ntfy/ntfy-integration").then((m) => m.NTFYIntegration),
nzbGet: () => import("../download-client/nzbget/nzbget-integration").then((m) => m.NzbGetIntegration),
openmediavault: () =>
import("../openmediavault/openmediavault-integration").then((m) => m.OpenMediaVaultIntegration),
openmediavault: () => import("../openmediavault/openmediavault-integration").then((m) => m.OpenMediaVaultIntegration),
opnsense: () => import("../opnsense/opnsense-integration").then((m) => m.OPNsenseIntegration),
overseerr: () => import("../overseerr/overseerr-integration").then((m) => m.OverseerrIntegration),
paperlessNgx: () => import("../paperless-ngx/paperless-ngx-integration").then((m) => m.PaperlessNgxIntegration),
patchmon: () => import("../patchmon/patchmon-integration").then((m) => m.PatchMonIntegration),
peaNut: () => import("../peanut/peanut-integration").then((m) => m.PeaNutIntegration),
piHole: () =>
import("../pi-hole/pi-hole-integration-factory").then((m) => [m.createPiHoleIntegrationAsync] as [IntegrationFactory]),
import("../pi-hole/pi-hole-integration-factory").then(
(m) => [m.createPiHoleIntegrationAsync] as [IntegrationFactory],
),
plex: () => import("../plex/plex-integration").then((m) => m.PlexIntegration),
prowlarr: () => import("../prowlarr/prowlarr-integration").then((m) => m.ProwlarrIntegration),
proxmox: () => import("../proxmox/proxmox-integration").then((m) => m.ProxmoxIntegration),
@@ -52,9 +52,9 @@ const mapOsDistributionEntry = (
osVersion: entry.os_version,
});
export const parsePatchMonStatsResponseAsync = async (
response: { json: () => Promise<unknown> },
): Promise<z.infer<typeof patchmonStatsResponseSchema>> => {
export const parsePatchMonStatsResponseAsync = async (response: {
json: () => Promise<unknown>;
}): Promise<z.infer<typeof patchmonStatsResponseSchema>> => {
let json: unknown;
try {
json = await response.json();
@@ -82,7 +82,5 @@ export const mapPatchMonStats = (data: z.infer<typeof patchmonStatsResponseSchem
totalOutdatedPackages: data.total_outdated_packages,
totalRepos: data.total_repos,
lastUpdated: data.last_updated,
osDistribution: [...data.os_distribution]
.map(mapOsDistributionEntry)
.sort((a, b) => b.count - a.count),
osDistribution: [...data.os_distribution].map(mapOsDistributionEntry).sort((a, b) => b.count - a.count),
});
@@ -97,8 +97,8 @@ export class PlexIntegration extends Integration implements IMediaServerIntegrat
const isAudioDirect = isStreamDirect(transcodeElement?.$.audioDecision);
const containerChanged = Boolean(
transcodeElement?.$.container &&
mediaInfoElement?.$.container &&
transcodeElement.$.container !== mediaInfoElement.$.container,
mediaInfoElement?.$.container &&
transcodeElement.$.container !== mediaInfoElement.$.container,
);
const bitrateKbps =
parseOptionalNumber(sessionElement?.$.bandwidth) ?? parseOptionalNumber(mediaInfoElement?.$.bitrate);
@@ -137,4 +137,4 @@ describe("PlexIntegration.getMediaReleasesAsync", () => {
},
]);
});
});
});