refactor: modularize slack/config/cron/daemon internals
This commit is contained in:
@@ -329,58 +329,6 @@ describe("buildServiceEnvironment", () => {
|
||||
expect(env.http_proxy).toBe("http://proxy.local:7890");
|
||||
expect(env.all_proxy).toBe("socks5://proxy.local:1080");
|
||||
});
|
||||
it("defaults NODE_EXTRA_CA_CERTS to system cert bundle on macOS", () => {
|
||||
const env = buildServiceEnvironment({
|
||||
env: { HOME: "/home/user" },
|
||||
port: 18789,
|
||||
platform: "darwin",
|
||||
});
|
||||
expect(env.NODE_EXTRA_CA_CERTS).toBe("/etc/ssl/cert.pem");
|
||||
});
|
||||
|
||||
it("does not default NODE_EXTRA_CA_CERTS on non-macOS", () => {
|
||||
const env = buildServiceEnvironment({
|
||||
env: { HOME: "/home/user" },
|
||||
port: 18789,
|
||||
platform: "linux",
|
||||
});
|
||||
expect(env.NODE_EXTRA_CA_CERTS).toBeUndefined();
|
||||
});
|
||||
|
||||
it("respects user-provided NODE_EXTRA_CA_CERTS over the default", () => {
|
||||
const env = buildServiceEnvironment({
|
||||
env: { HOME: "/home/user", NODE_EXTRA_CA_CERTS: "/custom/certs/ca.pem" },
|
||||
port: 18789,
|
||||
});
|
||||
expect(env.NODE_EXTRA_CA_CERTS).toBe("/custom/certs/ca.pem");
|
||||
});
|
||||
|
||||
it("defaults NODE_USE_SYSTEM_CA=1 on macOS", () => {
|
||||
const env = buildServiceEnvironment({
|
||||
env: { HOME: "/home/user" },
|
||||
port: 18789,
|
||||
platform: "darwin",
|
||||
});
|
||||
expect(env.NODE_USE_SYSTEM_CA).toBe("1");
|
||||
});
|
||||
|
||||
it("does not default NODE_USE_SYSTEM_CA on non-macOS", () => {
|
||||
const env = buildServiceEnvironment({
|
||||
env: { HOME: "/home/user" },
|
||||
port: 18789,
|
||||
platform: "linux",
|
||||
});
|
||||
expect(env.NODE_USE_SYSTEM_CA).toBeUndefined();
|
||||
});
|
||||
|
||||
it("respects user-provided NODE_USE_SYSTEM_CA over the default", () => {
|
||||
const env = buildServiceEnvironment({
|
||||
env: { HOME: "/home/user", NODE_USE_SYSTEM_CA: "0" },
|
||||
port: 18789,
|
||||
platform: "darwin",
|
||||
});
|
||||
expect(env.NODE_USE_SYSTEM_CA).toBe("0");
|
||||
});
|
||||
});
|
||||
|
||||
describe("buildNodeServiceEnvironment", () => {
|
||||
@@ -453,51 +401,49 @@ describe("buildNodeServiceEnvironment", () => {
|
||||
});
|
||||
expect(env.TMPDIR).toBe(os.tmpdir());
|
||||
});
|
||||
});
|
||||
|
||||
it("defaults NODE_EXTRA_CA_CERTS to system cert bundle on macOS for node services", () => {
|
||||
const env = buildNodeServiceEnvironment({
|
||||
env: { HOME: "/home/user" },
|
||||
platform: "darwin",
|
||||
});
|
||||
describe("shared Node TLS env defaults", () => {
|
||||
const builders = [
|
||||
{
|
||||
name: "gateway service env",
|
||||
build: (env: Record<string, string | undefined>, platform?: NodeJS.Platform) =>
|
||||
buildServiceEnvironment({ env, port: 18789, platform }),
|
||||
},
|
||||
{
|
||||
name: "node service env",
|
||||
build: (env: Record<string, string | undefined>, platform?: NodeJS.Platform) =>
|
||||
buildNodeServiceEnvironment({ env, platform }),
|
||||
},
|
||||
] as const;
|
||||
|
||||
it.each(builders)("$name defaults NODE_EXTRA_CA_CERTS on macOS", ({ build }) => {
|
||||
const env = build({ HOME: "/home/user" }, "darwin");
|
||||
expect(env.NODE_EXTRA_CA_CERTS).toBe("/etc/ssl/cert.pem");
|
||||
});
|
||||
|
||||
it("does not default NODE_EXTRA_CA_CERTS on non-macOS for node services", () => {
|
||||
const env = buildNodeServiceEnvironment({
|
||||
env: { HOME: "/home/user" },
|
||||
platform: "linux",
|
||||
});
|
||||
it.each(builders)("$name does not default NODE_EXTRA_CA_CERTS on non-macOS", ({ build }) => {
|
||||
const env = build({ HOME: "/home/user" }, "linux");
|
||||
expect(env.NODE_EXTRA_CA_CERTS).toBeUndefined();
|
||||
});
|
||||
|
||||
it("respects user-provided NODE_EXTRA_CA_CERTS for node services", () => {
|
||||
const env = buildNodeServiceEnvironment({
|
||||
env: { HOME: "/home/user", NODE_EXTRA_CA_CERTS: "/custom/certs/ca.pem" },
|
||||
});
|
||||
it.each(builders)("$name respects user-provided NODE_EXTRA_CA_CERTS", ({ build }) => {
|
||||
const env = build({ HOME: "/home/user", NODE_EXTRA_CA_CERTS: "/custom/certs/ca.pem" });
|
||||
expect(env.NODE_EXTRA_CA_CERTS).toBe("/custom/certs/ca.pem");
|
||||
});
|
||||
|
||||
it("defaults NODE_USE_SYSTEM_CA=1 on macOS for node services", () => {
|
||||
const env = buildNodeServiceEnvironment({
|
||||
env: { HOME: "/home/user" },
|
||||
platform: "darwin",
|
||||
});
|
||||
it.each(builders)("$name defaults NODE_USE_SYSTEM_CA=1 on macOS", ({ build }) => {
|
||||
const env = build({ HOME: "/home/user" }, "darwin");
|
||||
expect(env.NODE_USE_SYSTEM_CA).toBe("1");
|
||||
});
|
||||
|
||||
it("does not default NODE_USE_SYSTEM_CA on non-macOS for node services", () => {
|
||||
const env = buildNodeServiceEnvironment({
|
||||
env: { HOME: "/home/user" },
|
||||
platform: "linux",
|
||||
});
|
||||
it.each(builders)("$name does not default NODE_USE_SYSTEM_CA on non-macOS", ({ build }) => {
|
||||
const env = build({ HOME: "/home/user" }, "linux");
|
||||
expect(env.NODE_USE_SYSTEM_CA).toBeUndefined();
|
||||
});
|
||||
|
||||
it("respects user-provided NODE_USE_SYSTEM_CA for node services", () => {
|
||||
const env = buildNodeServiceEnvironment({
|
||||
env: { HOME: "/home/user", NODE_USE_SYSTEM_CA: "0" },
|
||||
platform: "darwin",
|
||||
});
|
||||
it.each(builders)("$name respects user-provided NODE_USE_SYSTEM_CA", ({ build }) => {
|
||||
const env = build({ HOME: "/home/user", NODE_USE_SYSTEM_CA: "0" }, "darwin");
|
||||
expect(env.NODE_USE_SYSTEM_CA).toBe("0");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -25,6 +25,16 @@ type BuildServicePathOptions = MinimalServicePathOptions & {
|
||||
env?: Record<string, string | undefined>;
|
||||
};
|
||||
|
||||
type SharedServiceEnvironmentFields = {
|
||||
stateDir: string | undefined;
|
||||
configPath: string | undefined;
|
||||
tmpDir: string;
|
||||
minimalPath: string;
|
||||
proxyEnv: Record<string, string | undefined>;
|
||||
nodeCaCerts: string | undefined;
|
||||
nodeUseSystemCa: string | undefined;
|
||||
};
|
||||
|
||||
const SERVICE_PROXY_ENV_KEYS = [
|
||||
"HTTP_PROXY",
|
||||
"HTTPS_PROXY",
|
||||
@@ -246,15 +256,8 @@ export function buildServiceEnvironment(params: {
|
||||
launchdLabel || (platform === "darwin" ? resolveGatewayLaunchAgentLabel(profile) : undefined);
|
||||
const systemdUnit = `${resolveGatewaySystemdServiceName(profile)}.service`;
|
||||
return {
|
||||
HOME: env.HOME,
|
||||
TMPDIR: sharedEnv.tmpDir,
|
||||
PATH: sharedEnv.minimalPath,
|
||||
...sharedEnv.proxyEnv,
|
||||
NODE_EXTRA_CA_CERTS: sharedEnv.nodeCaCerts,
|
||||
NODE_USE_SYSTEM_CA: sharedEnv.nodeUseSystemCa,
|
||||
...buildCommonServiceEnvironment(env, sharedEnv),
|
||||
OPENCLAW_PROFILE: profile,
|
||||
OPENCLAW_STATE_DIR: sharedEnv.stateDir,
|
||||
OPENCLAW_CONFIG_PATH: sharedEnv.configPath,
|
||||
OPENCLAW_GATEWAY_PORT: String(port),
|
||||
OPENCLAW_GATEWAY_TOKEN: token,
|
||||
OPENCLAW_LAUNCHD_LABEL: resolvedLaunchdLabel,
|
||||
@@ -275,14 +278,7 @@ export function buildNodeServiceEnvironment(params: {
|
||||
const gatewayToken =
|
||||
env.OPENCLAW_GATEWAY_TOKEN?.trim() || env.CLAWDBOT_GATEWAY_TOKEN?.trim() || undefined;
|
||||
return {
|
||||
HOME: env.HOME,
|
||||
TMPDIR: sharedEnv.tmpDir,
|
||||
PATH: sharedEnv.minimalPath,
|
||||
...sharedEnv.proxyEnv,
|
||||
NODE_EXTRA_CA_CERTS: sharedEnv.nodeCaCerts,
|
||||
NODE_USE_SYSTEM_CA: sharedEnv.nodeUseSystemCa,
|
||||
OPENCLAW_STATE_DIR: sharedEnv.stateDir,
|
||||
OPENCLAW_CONFIG_PATH: sharedEnv.configPath,
|
||||
...buildCommonServiceEnvironment(env, sharedEnv),
|
||||
OPENCLAW_GATEWAY_TOKEN: gatewayToken,
|
||||
OPENCLAW_LAUNCHD_LABEL: resolveNodeLaunchAgentLabel(),
|
||||
OPENCLAW_SYSTEMD_UNIT: resolveNodeSystemdServiceName(),
|
||||
@@ -295,18 +291,26 @@ export function buildNodeServiceEnvironment(params: {
|
||||
};
|
||||
}
|
||||
|
||||
function buildCommonServiceEnvironment(
|
||||
env: Record<string, string | undefined>,
|
||||
sharedEnv: SharedServiceEnvironmentFields,
|
||||
): Record<string, string | undefined> {
|
||||
return {
|
||||
HOME: env.HOME,
|
||||
TMPDIR: sharedEnv.tmpDir,
|
||||
PATH: sharedEnv.minimalPath,
|
||||
...sharedEnv.proxyEnv,
|
||||
NODE_EXTRA_CA_CERTS: sharedEnv.nodeCaCerts,
|
||||
NODE_USE_SYSTEM_CA: sharedEnv.nodeUseSystemCa,
|
||||
OPENCLAW_STATE_DIR: sharedEnv.stateDir,
|
||||
OPENCLAW_CONFIG_PATH: sharedEnv.configPath,
|
||||
};
|
||||
}
|
||||
|
||||
function resolveSharedServiceEnvironmentFields(
|
||||
env: Record<string, string | undefined>,
|
||||
platform: NodeJS.Platform,
|
||||
): {
|
||||
stateDir: string | undefined;
|
||||
configPath: string | undefined;
|
||||
tmpDir: string;
|
||||
minimalPath: string;
|
||||
proxyEnv: Record<string, string | undefined>;
|
||||
nodeCaCerts: string | undefined;
|
||||
nodeUseSystemCa: string | undefined;
|
||||
} {
|
||||
): SharedServiceEnvironmentFields {
|
||||
const stateDir = env.OPENCLAW_STATE_DIR;
|
||||
const configPath = env.OPENCLAW_CONFIG_PATH;
|
||||
// Keep a usable temp directory for supervised services even when the host env omits TMPDIR.
|
||||
|
||||
Reference in New Issue
Block a user