Skip to content

Commit

Permalink
Switch middlewares to accepting just one arg because V8 optimizes tha…
Browse files Browse the repository at this point in the history
…t better
  • Loading branch information
benjie committed May 17, 2024
1 parent 4848c75 commit fcec1a5
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions utils/graphile-config/src/middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ type ActivityFn<
TActivities extends MiddlewareObject<TActivities>,
TActivityName extends keyof TActivities,
> = TActivities[TActivityName] extends PluginHook<infer U> ? U : never;
type ActivityParameter<
TActivities extends MiddlewareObject<TActivities>,
TActivityName extends keyof TActivities,
> = TActivities[TActivityName] extends PluginHook<(arg: infer U) => any>
? U
: never;

type RealActivityFn<
TActivities extends MiddlewareObject<TActivities>,
Expand Down Expand Up @@ -41,16 +47,16 @@ export class Middlewares<TActivities extends MiddlewareObject<TActivities>> {
run<TActivityName extends keyof TActivities>(
activityName: TActivityName,
activity: (
...args: Parameters<ActivityFn<TActivities, TActivityName>>
arg: ActivityParameter<TActivities, TActivityName>,
) => ReturnType<ActivityFn<TActivities, TActivityName>>,
...args: Parameters<ActivityFn<TActivities, TActivityName>>
arg: ActivityParameter<TActivities, TActivityName>,
) {
const middlewares = this.middlewares[activityName];
if (middlewares === undefined) {
return activity(...args);
return activity(arg);
}
const m = middlewares.length - 1;
return executeMiddleware(middlewares, activity, args, 0, m);
return executeMiddleware(middlewares, activity, arg, 0, m);
}
}

Expand All @@ -60,16 +66,16 @@ function executeMiddleware<
>(
middlewares: ReadonlyArray<RealActivityFn<TActivities, TActivityName>>,
activity: (
...args: Parameters<ActivityFn<TActivities, TActivityName>>
arg: ActivityParameter<TActivities, TActivityName>,
) => ReturnType<ActivityFn<TActivities, TActivityName>>,
args: Parameters<ActivityFn<TActivities, TActivityName>>,
arg: ActivityParameter<TActivities, TActivityName>,
idx: number,
maxIdx: number,
): ReturnType<ActivityFn<TActivities, TActivityName>> {
const next =
idx === maxIdx
? () => activity(...args)
: () => executeMiddleware(middlewares, activity, args, idx + 1, maxIdx);
? () => activity(arg)
: () => executeMiddleware(middlewares, activity, arg, idx + 1, maxIdx);
const middleware = middlewares[idx];
return middleware(next, ...args) as any;
return middleware(next, arg) as any;
}

0 comments on commit fcec1a5

Please sign in to comment.