| 1 | export type StatsFilters = { |
| 2 | surface: "desktop" | "cli"; |
| 3 | status: string; |
| 4 | source: string; |
| 5 | version: string; |
| 6 | os: string; |
| 7 | platform: string; |
| 8 | osBuild: string; |
| 9 | osRevision: string; |
| 10 | distroId: string; |
| 11 | distroVersion: string; |
| 12 | kernelVersion: string; |
| 13 | sessionType: string; |
| 14 | arch: string; |
| 15 | channel: string; |
| 16 | runtimeVersion: string; |
| 17 | runtimeEngine: string; |
| 18 | failureKind: string; |
| 19 | failureReason: string; |
| 20 | exitCode: string; |
| 21 | recovery: string; |
| 22 | gpu: string; |
| 23 | newLatest: boolean; |
| 24 | regressed: boolean; |
| 25 | windowDays: 7 | 30; |
| 26 | }; |
| 27 | |
| 28 | const limited = (url: URL, name: string, max: number) => (url.searchParams.get(name) ?? "").slice(0, max); |
| 29 | const oneOf = (value: string, choices: readonly string[]) => choices.includes(value) ? value : ""; |
| 30 | |
| 31 | export function statsFilters(url: URL): StatsFilters { |
| 32 | const windowParam = limited(url, "window", 3); |
| 33 | const exitCodeParam = limited(url, "exitCode", 16); |
| 34 | return { |
| 35 | surface: limited(url, "surface", 7) === "cli" ? "cli" : "desktop", |
| 36 | status: oneOf(limited(url, "status", 8), ["open", "resolved", "ignored"]), |
| 37 | source: limited(url, "source", 32), |
| 38 | version: limited(url, "version", 64), |
| 39 | os: limited(url, "os", 32), |
| 40 | platform: limited(url, "platform", 80), |
| 41 | osBuild: limited(url, "osBuild", 7).replace(/[^0-9]/g, ""), |
| 42 | osRevision: limited(url, "osRevision", 7).replace(/[^0-9]/g, ""), |
| 43 | distroId: limited(url, "distro", 64).replace(/[^a-zA-Z0-9_.-]/g, ""), |
| 44 | distroVersion: limited(url, "distroVersion", 64).replace(/[^a-zA-Z0-9_.-]/g, ""), |
| 45 | kernelVersion: limited(url, "kernel", 128).replace(/[^a-zA-Z0-9_.+-]/g, ""), |
| 46 | sessionType: oneOf(limited(url, "session", 8), ["wayland", "x11", "remote", "unknown"]), |
| 47 | arch: limited(url, "arch", 32), |
| 48 | channel: limited(url, "channel", 32), |
| 49 | runtimeVersion: limited(url, "runtime", 128), |
| 50 | runtimeEngine: oneOf(limited(url, "engine", 16), ["webview2", "webkitgtk"]), |
| 51 | failureKind: limited(url, "failureKind", 64), |
| 52 | failureReason: limited(url, "reason", 64), |
| 53 | exitCode: exitCodeParam === "unknown" || /^-?\d+$/.test(exitCodeParam) ? exitCodeParam : "", |
| 54 | recovery: limited(url, "recovery", 32), |
| 55 | gpu: oneOf(limited(url, "gpu", 16), ["enabled", "disabled", "always", "on_demand", "unknown"]), |
| 56 | newLatest: limited(url, "new", 6) === "latest", |
| 57 | regressed: limited(url, "regressed", 1) === "1", |
| 58 | windowDays: windowParam === "7d" ? 7 : 30, |
| 59 | }; |
| 60 | } |
| 61 |