fix: detect nvm services from installed command (#51146)

This commit is contained in:
Peter Steinberger
2026-03-21 10:56:15 -07:00
parent 40f5305cd2
commit ebfc5f8240
2 changed files with 37 additions and 8 deletions

View File

@@ -326,4 +326,26 @@ describe("runDaemonInstall", () => {
expect(installDaemonServiceAndEmitMock).toHaveBeenCalledTimes(1);
});
it("reinstalls when the installed service still runs from nvm even if the installer runtime does not", async () => {
service.isLoaded.mockResolvedValue(true);
resolveAutoNodeExtraCaCertsMock.mockImplementation(({ execPath }) =>
typeof execPath === "string" && execPath.includes("/.nvm/")
? "/etc/ssl/certs/ca-certificates.crt"
: undefined,
);
service.readCommand.mockResolvedValue({
programArguments: ["/home/test/.nvm/versions/node/v22.18.0/bin/node", "dist/entry.js"],
environment: {},
} as never);
await runDaemonInstall({ json: true });
expect(installDaemonServiceAndEmitMock).toHaveBeenCalledTimes(1);
expect(resolveAutoNodeExtraCaCertsMock).toHaveBeenCalledWith(
expect.objectContaining({
execPath: "/home/test/.nvm/versions/node/v22.18.0/bin/node",
}),
);
});
});

View File

@@ -135,17 +135,24 @@ async function gatewayServiceNeedsAutoNodeExtraCaCertsRefresh(params: {
service: ReturnType<typeof resolveGatewayService>;
env: Record<string, string | undefined>;
}): Promise<boolean> {
const expectedNodeExtraCaCerts = resolveAutoNodeExtraCaCerts({
env: params.env,
execPath: process.execPath,
});
if (!expectedNodeExtraCaCerts) {
return false;
}
try {
const currentCommand = await params.service.readCommand(params.env);
const currentExecPath = currentCommand?.programArguments[0]?.trim();
if (!currentExecPath) {
return false;
}
const currentNodeExtraCaCerts = currentCommand?.environment?.NODE_EXTRA_CA_CERTS?.trim();
const expectedNodeExtraCaCerts = resolveAutoNodeExtraCaCerts({
env: {
...params.env,
...currentCommand.environment,
NODE_EXTRA_CA_CERTS: undefined,
},
execPath: currentExecPath,
});
if (!expectedNodeExtraCaCerts) {
return false;
}
return currentNodeExtraCaCerts !== expectedNodeExtraCaCerts;
} catch {
return false;