

























@@ -52,6 +52,17 @@ function handleBrowserRouteError(res: BrowserResponse, err: unknown) {
5252jsonError(res, 500, String(err));
5353}
545455+async function sendBasicJsonResponse(params: {
56+res: BrowserResponse;
57+run: () => Promise<unknown>;
58+}) {
59+try {
60+params.res.json(await params.run());
61+} catch (err) {
62+return handleBrowserRouteError(params.res, err);
63+}
64+}
65+5566async function withBasicProfileRoute(params: {
5667req: BrowserRequest;
5768res: BrowserResponse;
@@ -69,6 +80,29 @@ async function withBasicProfileRoute(params: {
6980}
7081}
718283+function registerBasicProfilePost(
84+app: BrowserRouteRegistrar,
85+ctx: BrowserRouteContext,
86+path: string,
87+run: (params: {
88+req: BrowserRequest;
89+res: BrowserResponse;
90+profileCtx: ProfileContext;
91+}) => Promise<void>,
92+) {
93+app.post(
94+path,
95+asyncBrowserRoute(async (req, res) => {
96+await withBasicProfileRoute({
97+ req,
98+ res,
99+ ctx,
100+run: async (profileCtx) => await run({ req, res, profileCtx }),
101+});
102+}),
103+);
104+}
105+72106async function withProfilesServiceMutation(params: {
73107res: BrowserResponse;
74108ctx: BrowserRouteContext;
@@ -290,94 +324,56 @@ export function registerBrowserBasicRoutes(app: BrowserRouteRegistrar, ctx: Brow
290324app.get(
291325"/",
292326asyncBrowserRoute(async (req, res) => {
293-try {
294-res.json(await buildBrowserStatus(req, ctx));
295-} catch (err) {
296-const mapped = toBrowserErrorResponse(err);
297-if (mapped) {
298-return jsonError(res, mapped.status, mapped.message);
299-}
300-jsonError(res, 500, String(err));
301-}
327+await sendBasicJsonResponse({
328+ res,
329+run: async () => await buildBrowserStatus(req, ctx),
330+});
302331}),
303332);
304333305334app.get(
306335"/doctor",
307336asyncBrowserRoute(async (req, res) => {
308-try {
309-const status = await buildBrowserStatus(req, ctx);
310-const report = buildBrowserDoctorReport({ status });
311-if (toBoolean(req.query.deep) === true || toBoolean(req.query.live) === true) {
312-report.checks.push(await runBrowserLiveProbe(req, ctx));
313-report.ok = report.checks.every((check) => check.status !== "fail");
314-}
315-res.json(report);
316-} catch (err) {
317-const mapped = toBrowserErrorResponse(err);
318-if (mapped) {
319-return jsonError(res, mapped.status, mapped.message);
320-}
321-jsonError(res, 500, String(err));
322-}
323-}),
324-);
325-326-// Start browser (profile-aware)
327-app.post(
328-"/start",
329-asyncBrowserRoute(async (req, res) => {
330-await withBasicProfileRoute({
331- req,
337+await sendBasicJsonResponse({
332338 res,
333- ctx,
334-run: async (profileCtx) => {
335-const headlessOverride = parseHeadlessStartOverride({ req, res, profileCtx });
336-if (!headlessOverride.ok) {
337-return;
339+run: async () => {
340+const status = await buildBrowserStatus(req, ctx);
341+const report = buildBrowserDoctorReport({ status });
342+if (toBoolean(req.query.deep) === true || toBoolean(req.query.live) === true) {
343+report.checks.push(await runBrowserLiveProbe(req, ctx));
344+report.ok = report.checks.every((check) => check.status !== "fail");
338345}
339-await profileCtx.ensureBrowserAvailable({ headless: headlessOverride.headless });
340-res.json({ ok: true, profile: profileCtx.profile.name });
346+return report;
341347},
342348});
343349}),
344350);
345351352+// Start browser (profile-aware)
353+registerBasicProfilePost(app, ctx, "/start", async ({ req, res, profileCtx }) => {
354+const headlessOverride = parseHeadlessStartOverride({ req, res, profileCtx });
355+if (!headlessOverride.ok) {
356+return;
357+}
358+await profileCtx.ensureBrowserAvailable({ headless: headlessOverride.headless });
359+res.json({ ok: true, profile: profileCtx.profile.name });
360+});
361+346362// Stop browser (profile-aware)
347-app.post(
348-"/stop",
349-asyncBrowserRoute(async (req, res) => {
350-await withBasicProfileRoute({
351- req,
352- res,
353- ctx,
354-run: async (profileCtx) => {
355-const result = await profileCtx.stopRunningBrowser();
356-res.json({
357-ok: true,
358-stopped: result.stopped,
359-profile: profileCtx.profile.name,
360-});
361-},
362-});
363-}),
364-);
363+registerBasicProfilePost(app, ctx, "/stop", async ({ res, profileCtx }) => {
364+const result = await profileCtx.stopRunningBrowser();
365+res.json({
366+ok: true,
367+stopped: result.stopped,
368+profile: profileCtx.profile.name,
369+});
370+});
365371366372// Reset profile (profile-aware)
367-app.post(
368-"/reset-profile",
369-asyncBrowserRoute(async (req, res) => {
370-await withBasicProfileRoute({
371- req,
372- res,
373- ctx,
374-run: async (profileCtx) => {
375-const result = await profileCtx.resetProfile();
376-res.json({ ok: true, profile: profileCtx.profile.name, ...result });
377-},
378-});
379-}),
380-);
373+registerBasicProfilePost(app, ctx, "/reset-profile", async ({ res, profileCtx }) => {
374+const result = await profileCtx.resetProfile();
375+res.json({ ok: true, profile: profileCtx.profile.name, ...result });
376+});
381377382378// Create a new profile
383379app.post(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。