From 94d93d560ac153ce155a0490f01c9aab8e41e20e Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 12 Aug 2024 03:24:38 +0800 Subject: [PATCH] core: better executeMiddlewareStack trace --- framework/framework/server.ts | 23 +++++++++++-------- .../ui-default/pages/problem_main.page.ts | 2 +- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/framework/framework/server.ts b/framework/framework/server.ts index 48e970ce9..2620173b7 100644 --- a/framework/framework/server.ts +++ b/framework/framework/server.ts @@ -287,17 +287,22 @@ class NotFoundHandler extends Handler { all() { } } -async function executeMiddlewareStack(context: any, middlewares: { name: string, func: Function }[]) { - const first = middlewares[0]; - if (!first) return Promise.resolve(); +function executeMiddlewareStack(context: any, middlewares: { name: string, func: Function }[]) { + let index = -1; context.__timers ||= {}; - context.__timers[`${first.name}.start`] = Date.now(); - const next = () => executeMiddlewareStack(context, middlewares.slice(1)); - try { - return await first.func(context, next); - } finally { - context.__timers[`${first.name}.end`] = Date.now(); + async function dispatch(i) { + if (i <= index) throw new Error('next() called multiple times'); + index = i; + if (!middlewares[i]) return null; + const name = middlewares[i].name; + context.__timers[`${name}.start`] = Date.now(); + try { + return await middlewares[i].func(context, dispatch.bind(null, i + 1)); + } finally { + context.__timers[`${name}.end`] = Date.now(); + } } + return dispatch(0); } interface WebServiceConfig { diff --git a/packages/ui-default/pages/problem_main.page.ts b/packages/ui-default/pages/problem_main.page.ts index 0c23998ee..fc23662fc 100644 --- a/packages/ui-default/pages/problem_main.page.ts +++ b/packages/ui-default/pages/problem_main.page.ts @@ -9,7 +9,7 @@ import Notification from 'vj/components/notification'; import { downloadProblemSet } from 'vj/components/zipDownloader'; import { NamedPage } from 'vj/misc/Page'; import { - addSpeculationRules, delay, i18n, pjax, request, setTemporaryViewTransitionNames, tpl, + addSpeculationRules, delay, i18n, pjax, request, tpl, } from 'vj/utils'; const list = [];