mirror of
https://github.com/harivansh-afk/sandbox-agent.git
synced 2026-04-15 19:05:18 +00:00
SDK: Add ensureServer() for automatic server recovery
Add ensureServer() to SandboxProvider interface to handle cases where the sandbox-agent server stops or goes to sleep. The SDK now calls this method after 3 consecutive health-check failures, allowing providers to restart the server if needed. Most built-in providers (E2B, Daytona, Vercel, Modal, ComputeSDK) implement this. Docker and Cloudflare manage server lifecycle differently, and Local uses managed child processes. Also update docs for quickstart, architecture, multiplayer, and session persistence; mark persist-* packages as deprecated; and add ensureServer implementations to all applicable providers. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
d008283c17
commit
35840facdd
38 changed files with 620 additions and 205 deletions
|
|
@ -1,8 +1,15 @@
|
|||
import { describe, it, expect } from "vitest";
|
||||
import { buildHeaders } from "@sandbox-agent/example-shared";
|
||||
import { setupDockerSandboxAgent } from "../src/docker.ts";
|
||||
import { startDockerSandbox } from "@sandbox-agent/example-shared/docker";
|
||||
|
||||
const shouldRun = process.env.RUN_DOCKER_EXAMPLES === "1";
|
||||
/**
|
||||
* Docker integration test.
|
||||
*
|
||||
* Set SANDBOX_AGENT_DOCKER_IMAGE to the image tag to test (e.g. a locally-built
|
||||
* full image). The test starts a container from that image, waits for
|
||||
* sandbox-agent to become healthy, and validates the /v1/health endpoint.
|
||||
*/
|
||||
const image = process.env.SANDBOX_AGENT_DOCKER_IMAGE;
|
||||
const shouldRun = Boolean(image);
|
||||
const timeoutMs = Number.parseInt(process.env.SANDBOX_TEST_TIMEOUT_MS || "", 10) || 300_000;
|
||||
|
||||
const testFn = shouldRun ? it : it.skip;
|
||||
|
|
@ -11,11 +18,29 @@ describe("docker example", () => {
|
|||
testFn(
|
||||
"starts sandbox-agent and responds to /v1/health",
|
||||
async () => {
|
||||
const { baseUrl, token, cleanup } = await setupDockerSandboxAgent();
|
||||
const { baseUrl, cleanup } = await startDockerSandbox({
|
||||
port: 2468,
|
||||
image: image!,
|
||||
});
|
||||
try {
|
||||
const response = await fetch(`${baseUrl}/v1/health`, {
|
||||
headers: buildHeaders({ token }),
|
||||
});
|
||||
// Wait for health check
|
||||
let healthy = false;
|
||||
for (let i = 0; i < 60; i++) {
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/v1/health`);
|
||||
if (res.ok) {
|
||||
const data = await res.json();
|
||||
if (data.status === "ok") {
|
||||
healthy = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch {}
|
||||
await new Promise((r) => setTimeout(r, 1000));
|
||||
}
|
||||
expect(healthy).toBe(true);
|
||||
|
||||
const response = await fetch(`${baseUrl}/v1/health`);
|
||||
expect(response.ok).toBe(true);
|
||||
const data = await response.json();
|
||||
expect(data.status).toBe("ok");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue