Assessor_2.0/src/api/prepared-assessment-context.ts

31 lines
1.3 KiB
TypeScript

import type { AssessorApiClient } from './assessor-api-client';
import type { AssessmentContextResponse } from './assessor-api-contract';
// The client-opening workflow and every mounted reader share the same request.
// Weak ownership prevents old datasets (and their context) from being retained.
let requests = new WeakMap<object, Map<string, Promise<AssessmentContextResponse>>>();
export function preparedAssessmentContext(
api: Pick<AssessorApiClient, 'getAssessmentContext'>,
dataset: object,
projectId: string,
assessmentIds: string[],
scanRunIds: string[] = []
): Promise<AssessmentContextResponse> {
const assessments = [...new Set(assessmentIds)].sort();
const scans = [...new Set(scanRunIds)].sort();
const key = JSON.stringify([projectId, assessments, scans]);
let scopes = requests.get(dataset);
if (!scopes) { scopes = new Map(); requests.set(dataset, scopes); }
let request = scopes.get(key);
if (!request) {
request = api.getAssessmentContext(projectId, assessments, scans);
scopes.set(key, request);
}
// Keep failures too: mounting another reader must not silently retry. Opening
// the client again creates a fresh dataset and therefore a fresh attempt.
return request;
}
export function resetPreparedAssessmentContextForTests(): void { requests = new WeakMap(); }