46
47
async getRelatedInformation(query: string, types: RelatedInformationType[], token: CancellationToken): Promise<RelatedInformationResult[]> {
49
throw new Error('No related information providers registered');
50
}
52
>
// get providers for each type
53
>
const providers: IAiRelatedInformationProvider[] = [];
54
>
for (const type of types) {
55
>
const typeProviders = this._providers.get(type);
56
>
if (typeProviders) {
57
>
providers.push(...typeProviders);
58
>
}
59
>
}
60
>
61
>
if (providers.length === 0) {
62
throw new Error('No related information providers registered for the given types');
63
}
65
>
const stopwatch = StopWatch.create();
66
>
67
>
const cancellablePromises: Array<CancelablePromise<RelatedInformationResult[]>> = providers.map((provider) => {
68
>
return createCancelablePromise(async t => {
69
>
try {
70
>
const result = await provider.provideAiRelatedInformation(query, t);
71
>
// double filter just in case
72
>
return result.filter(r => types.includes(r.type));
73
>
} catch (e) {
74
// logged in extension host
75
}
76
return [];
78
>
});
79
>
80
>
try {
81
>
const results = await raceTimeout(
82
>
Promise.allSettled(cancellablePromises),
83
>
AiRelatedInformationService.DEFAULT_TIMEOUT,
84
>
() => {
85
cancellablePromises.forEach(p => p.cancel());
86
this.logService.warn('[AiRelatedInformationService]: Related information provider timed out');
87
}
89
>
if (!results) {
90
return [];
91
}