INTEGRITY Документация

Начало работы

1. Установите пакет preview

В проекте Workers, который уже использует Sandbox, или в новом проекте на основе шаблона Sandbox:

npm i @cloudflare/sandbox@next

Создание и развертывание Worker и образ контейнера sandbox из той же preview-линии.

2. Экспортируйте класс Sandbox

import { Sandbox } from "@cloudflare/sandbox";

export { Sandbox };
import { Sandbox } from "@cloudflare/sandbox";

export { Sandbox };

Храните свой wrangler привязку Durable Object и конфигурацию контейнера. Специфичные для preview транспортные переменные не требуются.

3. Запустите процесс

exec() запускает программу из argv : массив с путём или именем исполняемого файла, а затем его аргументами. Ожидает, пока песочница не сможет запустить процесс, затем возвращает дескриптор процесса. Оно делает не дождитесь завершения процесса.

Собирайте результаты с помощью методов handle, например output(), либо в потоковом режиме с помощью logs().

import { getSandbox, proxyToSandbox } from "@cloudflare/sandbox";

export { Sandbox } from "@cloudflare/sandbox";

export default {
	async fetch(request, env) {
		const proxy = await proxyToSandbox(request, env);
		if (proxy) return proxy;

		const sandbox = getSandbox(env.Sandbox, "preview-demo");
		const process = await sandbox.exec(["python3", "-c", "print(2 + 2)"]);
		const output = await process.output({ encoding: "utf8" });

		return Response.json({
			id: process.id,
			pid: process.pid,
			stdout: output.stdout,
			exitCode: output.exitCode,
		});
	},
};
import { getSandbox, proxyToSandbox } from "@cloudflare/sandbox";

export { Sandbox } from "@cloudflare/sandbox";

type Env = {
	Sandbox: DurableObjectNamespace<import("@cloudflare/sandbox").Sandbox>;
};

export default {
	async fetch(request: Request, env: Env): Promise<Response> {
		const proxy = await proxyToSandbox(request, env);
		if (proxy) return proxy;

		const sandbox = getSandbox(env.Sandbox, "preview-demo");
		const process = await sandbox.exec(["python3", "-c", "print(2 + 2)"]);
		const output = await process.output({ encoding: "utf8" });

		return Response.json({
			id: process.id,
			pid: process.pid,
			stdout: output.stdout,
			exitCode: output.exitCode,
		});
	},
};

Каждый элемент argv соответствует одному аргументу процесса. SDK не запускает оболочку и не не экранирует argv для shell. Пробелы и специальные символы в элементе остаются внутри этого аргумента.

Синтаксис shell (&&, конвейеры, перенаправления, глобы) требует явного вызова shell, где сам скрипт передаётся отдельным аргументом:

const process = await sandbox.exec([
	"/bin/bash",
	"-lc",
	"echo hello && uname -a",
]);
const { stdout } = await process.output({ encoding: "utf8" });
const process = await sandbox.exec([
	"/bin/bash",
	"-lc",
	"echo hello && uname -a",
]);
const { stdout } = await process.output({ encoding: "utf8" });

4. Чем это отличается от стабильного пакета

Далее