codexmobile-relay / scripts /relay-real-chat-smoke-runtime.mjs
Codex
deploy: CodexMobile Relay
90f0300
Raw
History Blame Contribute Delete
3.06 kB
import fs from 'node:fs/promises';
import os from 'node:os';
import path from 'node:path';
import {
copyCodexRuntime,
sleep,
startProcess
} from './relay-real-chat-smoke-utils.mjs';
const CLEANUP_GRACE_MS = 800;
function isChildStillRunning(child) {
return child?.exitCode === null && child?.signalCode === null;
}
export async function terminateSmokeChildren(children, { graceMs = CLEANUP_GRACE_MS, sleepFn = sleep } = {}) {
for (const child of [...children].reverse()) {
if (isChildStillRunning(child)) {
child.kill('SIGTERM');
}
}
await sleepFn(graceMs);
for (const child of children) {
if (isChildStillRunning(child)) {
child.kill('SIGKILL');
}
}
}
function startSmokeChild({ children, command, args, env, logPath, rootDir }) {
const child = startProcess({ command, args, cwd: rootDir, logPath, env });
children.push(child);
return { child, logPath };
}
function createRuntimeStarters({ children, codexHome, connectorId, localPort, macUrl, mobileHome, relaySecret, rootDir }) {
return {
startLocalServer() {
return startSmokeChild({
children,
command: 'npm',
args: ['start'],
rootDir,
logPath: path.join(mobileHome, 'server.log'),
env: {
HOST: '127.0.0.1',
PORT: String(localPort),
CODEX_HOME: codexHome,
CODEXMOBILE_HOME: mobileHome
}
});
},
startConnector(logName) {
return startSmokeChild({
children,
command: 'npm',
args: ['run', 'relay:mac'],
rootDir,
logPath: path.join(mobileHome, logName),
env: {
CODEX_HOME: codexHome,
CODEXMOBILE_HOME: mobileHome,
CODEXMOBILE_RELAY_URL: macUrl,
CODEXMOBILE_RELAY_SECRET: relaySecret,
CODEXMOBILE_RELAY_LOCAL_URL: `http://127.0.0.1:${localPort}`,
CODEXMOBILE_RELAY_DEVICE_NAME: 'real-chat-smoke',
CODEXMOBILE_RELAY_CONNECTOR_ID: connectorId,
CODEXMOBILE_RELAY_KEEPALIVE_MS: '0'
}
});
}
};
}
export async function createSmokeRuntime({ connectorId, localPort, macUrl, relaySecret, rootDir }) {
const codexHome = await fs.mkdtemp(path.join(os.tmpdir(), 'codexmobile-real-chat-codehome.'));
const mobileHome = await fs.mkdtemp(path.join(os.tmpdir(), 'codexmobile-real-chat-mobilehome.'));
const children = [];
try {
await copyCodexRuntime(codexHome);
} catch (error) {
await Promise.all([
fs.rm(codexHome, { recursive: true, force: true }),
fs.rm(mobileHome, { recursive: true, force: true })
]);
throw error;
}
return {
codexHome,
mobileHome,
...createRuntimeStarters({ children, codexHome, connectorId, localPort, macUrl, mobileHome, relaySecret, rootDir }),
async cleanup({ keepLogs = false } = {}) {
await terminateSmokeChildren(children);
await fs.rm(codexHome, { recursive: true, force: true });
if (!keepLogs) {
await fs.rm(mobileHome, { recursive: true, force: true });
}
}
};
}