import type { CrashReportStore } from '../crash-reporting/crash-report-store' export const inFlightSubmissions = new Set() export const submittedReportIds = new Set() const MAX_SUBMITTED_REPORT_IDS = 256 export function rememberSubmittedReportId(reportId: string): void { // Why: report ids are IPC input. Keep duplicate-send suppression useful for // recent reports without retaining every id a broken renderer can vary. submittedReportIds.delete(reportId) submittedReportIds.add(reportId) while (submittedReportIds.size > MAX_SUBMITTED_REPORT_IDS) { const oldestId = submittedReportIds.keys().next().value if (oldestId === undefined) { break } submittedReportIds.delete(oldestId) } } export async function getLatestPendingReport( store: CrashReportStore ): Promise>> { const reports = await store.listRecent() return ( reports.find((report) => report.status === 'pending' && !submittedReportIds.has(report.id)) ?? null ) } export async function getLatestSendableReport( store: CrashReportStore ): Promise>> { const reports = await store.listRecent() return ( reports.find( (report) => (report.status === 'pending' || report.status === 'dismissed') && !submittedReportIds.has(report.id) ) ?? null ) } export async function getRequestedCrashReport( store: CrashReportStore, args?: { reportId?: string } ): Promise>> { if (args?.reportId) { return store.getById(args.reportId) } // Why: Help > Report Crash can intentionally submit without a report ID. // Do not replace that uncaptured report with a pending crash that appears later. return args ? null : getLatestPendingReport(store) }