Skip to main content

roder_ext_runner_e2b/
lib.rs

1use std::sync::Arc;
2
3use roder_api::capabilities::CapabilityRequest;
4use roder_api::extension::{
5    ExtensionManifest, ExtensionRegistryBuilder, ProvidedService, RoderExtension,
6};
7use roder_ext_runner_hosted_common::{HostedRunnerProvider, HostedRunnerSpec};
8use semver::Version;
9
10pub const PROVIDER_ID: &str = "e2b";
11pub const TOKEN_ENV: &str = "E2B_API_KEY";
12pub const BASE_URL_ENV: &str = "E2B_RUNNER_BASE_URL";
13pub const LIVE_ENV: &str = "RODER_LIVE_E2B_RUNNER";
14
15pub fn e2b_runner_spec() -> HostedRunnerSpec {
16    HostedRunnerSpec {
17        provider_id: PROVIDER_ID,
18        token_env: TOKEN_ENV,
19        base_url_env: BASE_URL_ENV,
20        default_base_url: "https://api.e2b.dev/roder/runner",
21        live_env: LIVE_ENV,
22    }
23}
24
25#[derive(Debug, Default)]
26pub struct E2bRunnerExtension;
27
28impl RoderExtension for E2bRunnerExtension {
29    fn manifest(&self) -> ExtensionManifest {
30        ExtensionManifest {
31            id: "roder-ext-runner-e2b".to_string(),
32            name: "E2B Runner".to_string(),
33            version: Version::new(0, 1, 0),
34            api_version: "0.1.0".to_string(),
35            description: Some("Runs remote-runner sessions through E2B.".to_string()),
36            provides: vec![ProvidedService::RemoteRunnerProvider(
37                PROVIDER_ID.to_string(),
38            )],
39            required_capabilities: vec![
40                CapabilityRequest::new("network.http"),
41                CapabilityRequest::new(format!("secret.read.{TOKEN_ENV}")),
42            ],
43        }
44    }
45
46    fn install(&self, registry: &mut ExtensionRegistryBuilder) -> anyhow::Result<()> {
47        registry.remote_runner_provider(Arc::new(HostedRunnerProvider::new(e2b_runner_spec())));
48        Ok(())
49    }
50}