Skip to main content

examples/sandbox_provider_registry.exs

defmodule DemoRemoteProvider do
  @behaviour BeamWeaver.Sandbox.Provider

  alias BeamWeaver.Sandbox

  @impl true
  def build(spec, opts) do
    root =
      spec.config
      |> Map.get(:root, Path.join(System.tmp_dir!(), "beam_weaver_demo_#{Keyword.fetch!(opts, :sandbox_id)}"))
      |> Path.expand()

    {:ok, Sandbox.local(root: root)}
  end
end

alias BeamWeaver.Sandbox
alias BeamWeaver.Sandbox.Registry

{:ok, registry} =
  Registry.new(
    providers: [
      %{
        id: :demo_remote,
        module: DemoRemoteProvider,
        config: %{api_key: "sk-demo"},
        capabilities: %{sandbox_id: true, snapshot: true}
      }
    ]
  )

{:ok, sandbox} =
  Registry.build(registry, :demo_remote,
    sandbox_id: "sbx_demo",
    snapshot_id: "snap_demo"
  )

result =
  Sandbox.execute(sandbox, "printf 'sandbox ok'",
    command_id: "cmd_demo",
    metadata: %{
      provider_id: "demo_remote",
      sandbox_id: "sbx_demo",
      snapshot_id: "snap_demo",
      request_token: "secret"
    }
  )

IO.inspect(result, label: "sandbox result", pretty: true)