mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-25 20:05:46 -06:00
42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
import type { OpenClawExecServer } from "./sandbox-exec-server/types.js";
|
|
|
|
export const sandboxExecServerRegistry = {
|
|
servers: new Map<string, Promise<OpenClawExecServer>>(),
|
|
async close(server: OpenClawExecServer): Promise<void> {
|
|
if (server.closed) {
|
|
return;
|
|
}
|
|
server.closed = true;
|
|
for (const client of server.server.clients) {
|
|
client.close(1001, "shutdown");
|
|
}
|
|
await new Promise<void>((resolve) => {
|
|
server.server.close(() => resolve());
|
|
});
|
|
const cleanup = await Promise.allSettled([
|
|
...server.cleanupTasks,
|
|
...[...server.children].map(async (child) => await child.terminate()),
|
|
]);
|
|
const failures = cleanup.flatMap((result) =>
|
|
result.status === "rejected" ? [result.reason] : [],
|
|
);
|
|
if (failures.length > 0) {
|
|
throw new AggregateError(failures, "Codex sandbox exec-server child cleanup failed");
|
|
}
|
|
},
|
|
async closeAll(): Promise<void> {
|
|
const servers = await Promise.allSettled(this.servers.values());
|
|
this.servers.clear();
|
|
await Promise.all(
|
|
servers.map(async (entry) => {
|
|
if (entry.status !== "fulfilled") {
|
|
return;
|
|
}
|
|
const server = entry.value;
|
|
server.refCount = 0;
|
|
await this.close(server);
|
|
}),
|
|
);
|
|
},
|
|
};
|