




















@@ -45,6 +45,7 @@ type RestartPostCheckContext = {
4545json: boolean;
4646stdout: Writable;
4747warnings: string[];
48+warn?: (message: string) => void;
4849fail: (message: string, hints?: string[]) => void;
4950};
5051@@ -58,6 +59,7 @@ type ServiceRecoveryResult = {
5859type ServiceRecoveryContext = {
5960json: boolean;
6061stdout: Writable;
62+warn?: (message: string) => void;
6163fail: (message: string, hints?: string[]) => void;
6264};
6365@@ -91,6 +93,14 @@ function emitActionMessage(params: {
9193}
9294}
939596+function mergeWarnings(
97+captured: readonly string[],
98+reported?: readonly string[],
99+): string[] | undefined {
100+const combined = [...captured, ...(reported ?? [])];
101+return combined.length > 0 ? combined : undefined;
102+}
103+94104async function handleServiceNotLoaded(params: {
95105serviceNoun: string;
96106service: GatewayService;
@@ -249,7 +259,8 @@ export async function runServiceStart(params: {
249259repairLoadedService?: (ctx: ServiceStartRepairContext) => Promise<ServiceRecoveryResult | null>;
250260}) {
251261const json = Boolean(params.opts?.json);
252-const { stdout, emit, fail } = createDaemonActionContext({ action: "start", json });
262+const { stdout, warnings, emit, fail } = createDaemonActionContext({ action: "start", json });
263+const warn = json ? (message: string) => warnings.push(message) : undefined;
253264const loaded = await resolveServiceLoadedOrFail({
254265serviceNoun: params.serviceNoun,
255266service: params.service,
@@ -275,13 +286,13 @@ export async function runServiceStart(params: {
275286}
276287if (!loaded) {
277288try {
278-const handled = await params.onNotLoaded?.({ json, stdout, fail });
289+const handled = await params.onNotLoaded?.({ json, stdout, warn, fail });
279290if (handled) {
280291emit({
281292ok: true,
282293result: handled.result,
283294message: handled.message,
284-warnings: handled.warnings,
295+warnings: mergeWarnings(warnings, handled.warnings),
285296service: buildDaemonServiceSnapshot(params.service, handled.loaded ?? false),
286297});
287298if (!json && handled.message) {
@@ -296,7 +307,11 @@ export async function runServiceStart(params: {
296307}
297308}
298309try {
299-const startResult = await startGatewayService(params.service, { env: process.env, stdout });
310+const startResult = await startGatewayService(params.service, {
311+env: process.env,
312+ stdout,
313+ warn,
314+});
300315if (startResult.outcome === "missing-install") {
301316await handleServiceNotLoaded({
302317serviceNoun: params.serviceNoun,
@@ -320,6 +335,7 @@ export async function runServiceStart(params: {
320335result: "scheduled",
321336message: restartStatus.message,
322337service: buildDaemonServiceSnapshot(params.service, startResult.state.loaded),
338+warnings: warnings.length ? warnings : undefined,
323339},
324340});
325341return;
@@ -329,6 +345,7 @@ export async function runServiceStart(params: {
329345const handled = await params.repairLoadedService?.({
330346 json,
331347 stdout,
348+ warn,
332349 fail,
333350state: startResult.state,
334351issues: startResult.issues,
@@ -338,7 +355,7 @@ export async function runServiceStart(params: {
338355ok: true,
339356result: handled.result,
340357message: handled.message,
341-warnings: handled.warnings,
358+warnings: mergeWarnings(warnings, handled.warnings),
342359service: buildDaemonServiceSnapshot(params.service, handled.loaded ?? true),
343360});
344361if (!json && handled.message) {
@@ -363,6 +380,7 @@ export async function runServiceStart(params: {
363380ok: true,
364381result: "started",
365382service: buildDaemonServiceSnapshot(params.service, startResult.state.loaded),
383+warnings: warnings.length ? warnings : undefined,
366384});
367385} catch (err) {
368386const hints = params.renderStartHints();
@@ -470,8 +488,8 @@ export async function runServiceRestart(params: {
470488onNotLoaded?: (ctx: ServiceRecoveryContext) => Promise<ServiceRecoveryResult | null>;
471489}): Promise<boolean> {
472490const json = Boolean(params.opts?.json);
473-const { stdout, emit, fail } = createDaemonActionContext({ action: "restart", json });
474-const warnings: string[] = [];
491+const { stdout, warnings, emit, fail } = createDaemonActionContext({ action: "restart", json });
492+const warn = json ? (message: string) => warnings.push(message) : undefined;
475493const restartIntent = params.opts?.restartIntent;
476494let handledRecovery: ServiceRecoveryResult | null = null;
477495let recoveredLoadedState: boolean | null = null;
@@ -519,7 +537,7 @@ export async function runServiceRestart(params: {
519537520538if (!loaded) {
521539try {
522-handledRecovery = (await params.onNotLoaded?.({ json, stdout, fail })) ?? null;
540+handledRecovery = (await params.onNotLoaded?.({ json, stdout, warn, fail })) ?? null;
523541} catch (err) {
524542fail(`${params.serviceNoun} restart failed: ${String(err)}`);
525543return false;
@@ -590,7 +608,7 @@ export async function runServiceRestart(params: {
590608});
591609}
592610try {
593-restartResult = await params.service.restart({ env: process.env, stdout });
611+restartResult = await params.service.restart({ env: process.env, stdout, warn });
594612} catch (err) {
595613if (wroteRestartIntent) {
596614clearGatewayRestartIntentSync();
@@ -603,7 +621,13 @@ export async function runServiceRestart(params: {
603621return emitScheduledRestart(restartStatus, loaded || recoveredLoadedState === true);
604622}
605623if (params.postRestartCheck) {
606-const postRestartResult = await params.postRestartCheck({ json, stdout, warnings, fail });
624+const postRestartResult = await params.postRestartCheck({
625+ json,
626+ stdout,
627+ warnings,
628+ warn,
629+ fail,
630+});
607631if (postRestartResult) {
608632restartStatus = describeGatewayServiceRestart(params.serviceNoun, postRestartResult);
609633if (restartStatus.scheduled) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。