Skip to content

Commit c0b15b0

Browse files
committed
use tuple results rather than array mutation
Signed-off-by: Adam Wootton <[email protected]>
1 parent 97bdfaa commit c0b15b0

File tree

1 file changed

+21
-23
lines changed

1 file changed

+21
-23
lines changed

libs/providers/multi-provider/src/lib/multi-provider.ts

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,7 @@ export class MultiProvider implements Provider {
142142
throw new GeneralError('Hook context not available for evaluation');
143143
}
144144

145-
const tasks: Promise<boolean>[] = [];
146-
const resolutions: ProviderResolutionResult<T>[] = [];
145+
const tasks: Promise<[boolean, ProviderResolutionResult<T> | null]>[] = [];
147146

148147
for (const providerEntry of this.providerEntries) {
149148
const task = this.evaluateProviderEntry(
@@ -154,22 +153,22 @@ export class MultiProvider implements Provider {
154153
hookContext,
155154
hookHints,
156155
context,
157-
resolutions,
158156
);
159157

158+
tasks.push(task);
159+
160160
if (this.evaluationStrategy.runMode === 'sequential') {
161-
const shouldEvaluateNext = await task;
161+
const [shouldEvaluateNext] = await task;
162162
if (!shouldEvaluateNext) {
163163
break;
164164
}
165165
}
166-
167-
tasks.push(task);
168166
}
169167

170-
if (this.evaluationStrategy.runMode === 'parallel') {
171-
await Promise.all(tasks);
172-
}
168+
const results = await Promise.all(tasks);
169+
const resolutions = results
170+
.map(([_, resolution]) => resolution)
171+
.filter((r): r is ProviderResolutionResult<T> => Boolean(r));
173172

174173
const finalResult = this.evaluationStrategy.determineFinalResult({ flagKey, flagType }, context, resolutions);
175174

@@ -192,8 +191,7 @@ export class MultiProvider implements Provider {
192191
hookContext: HookContext,
193192
hookHints: HookHints,
194193
context: EvaluationContext,
195-
resolutions: ProviderResolutionResult<T>[],
196-
) {
194+
): Promise<[boolean, ProviderResolutionResult<T> | null]> {
197195
let thrownError: unknown;
198196
let evaluationResult: ResolutionDetails<T> | undefined = undefined;
199197
const provider = providerEntry.provider;
@@ -206,34 +204,34 @@ export class MultiProvider implements Provider {
206204
};
207205

208206
if (!this.evaluationStrategy.shouldEvaluateThisProvider(strategyContext, context)) {
209-
return true;
207+
return [true, null];
210208
}
211209

210+
let resolution: ProviderResolutionResult<T>;
211+
212212
try {
213213
evaluationResult = await this.evaluateProviderAndHooks(flagKey, defaultValue, provider, hookContext, hookHints);
214-
resolutions.push({
214+
resolution = {
215215
details: evaluationResult,
216216
provider: provider,
217217
providerName: providerEntry.name,
218-
});
218+
};
219219
} catch (error: unknown) {
220-
resolutions.push({
220+
resolution = {
221221
thrownError: error,
222222
provider: provider,
223223
providerName: providerEntry.name,
224-
});
224+
};
225225
thrownError = error;
226226
}
227227

228228
if (this.evaluationStrategy.runMode === 'sequential') {
229-
return this.evaluationStrategy.shouldEvaluateNextProvider(
230-
strategyContext,
231-
context,
232-
evaluationResult,
233-
thrownError,
234-
);
229+
return [
230+
this.evaluationStrategy.shouldEvaluateNextProvider(strategyContext, context, evaluationResult, thrownError),
231+
resolution,
232+
];
235233
}
236-
return true;
234+
return [true, resolution];
237235
}
238236

239237
private async evaluateProviderAndHooks<T extends boolean | string | number | JsonValue>(

0 commit comments

Comments
 (0)