Question coverage checks
The policy implementation follows.
ts
export function validateAnswerBatch<Data>(
inputIds: readonly string[],
items: readonly AnswerItem<Data>[],
maxItems: number,
): void {
if (
!Number.isSafeInteger(maxItems) ||
maxItems < 1 ||
!inputIds.length ||
new Set(inputIds).size !== inputIds.length ||
inputIds.some((id) => typeof id !== 'string' || !id)
)
throw new TypeError('Invalid answer input ids or limit');
if (
!items.length ||
items.length > maxItems ||
new Set(items.map((item) => item.id)).size !== items.length
)
throw new TypeError('Invalid answer item count or ids');
const covered = new Set<string>();
for (const item of items) {
if (
typeof item.id !== 'string' ||
!item.id ||
!['ready', 'unavailable', 'conflict'].includes(item.sourceStatus) ||
!item.inputIds.length ||
new Set(item.inputIds).size !== item.inputIds.length
)
throw new TypeError('Invalid answer item');
for (const id of item.inputIds) {
if (!inputIds.includes(id)) throw new TypeError(`Unknown answer input: ${id}`);
covered.add(id);
}
}
if (inputIds.some((id) => !covered.has(id)))
throw new TypeError('Answer tasks do not cover every input');
}