computesdk 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +573 -185
- package/dist/index.d.mts +416 -340
- package/dist/index.d.ts +416 -340
- package/dist/index.js +910 -450
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +906 -436
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -33
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/config.ts","../src/utils.ts","../src/registry.ts","../src/providers/base.ts","../src/sdk.ts"],"sourcesContent":["/**\n * ComputeSDK Core\n * \n * A unified abstraction layer for executing code in secure,\n * isolated sandboxed environments across multiple cloud providers.\n */\n\n// Export all types\nexport * from './types';\n\n// Export all errors\nexport * from './errors';\n\n// Export configuration utilities\nexport * from './config';\n\n// Export utilities\nexport { executeSandbox, retry } from './utils';\n\n// Export registry\nexport { createComputeRegistry } from './registry';\n\n// Export base provider for extension\nexport { BaseProvider } from './providers/base';\n\n// Export main SDK class\nexport { ComputeSDK } from './sdk';\n\n// Default export\nimport { ComputeSDK } from './sdk';\nexport default ComputeSDK;\n","/**\n * ComputeSDK Error Handling\n * \n * This file contains standardized error classes for the ComputeSDK.\n */\n\n/**\n * Base error class for all ComputeSDK errors\n */\nexport abstract class ComputeError extends Error {\n /** Error code identifier */\n abstract readonly code: string;\n\n /** Whether the operation can be retried */\n abstract readonly isRetryable: boolean;\n\n /** Provider where the error occurred */\n readonly provider: string;\n\n /** Sandbox ID where the error occurred */\n readonly sandboxId?: string;\n\n /**\n * Create a new ComputeError\n * \n * @param message Error message\n * @param provider Provider identifier\n * @param sandboxId Optional sandbox identifier\n */\n constructor(message: string, provider: string, sandboxId?: string) {\n super(message);\n this.name = this.constructor.name;\n this.provider = provider;\n this.sandboxId = sandboxId;\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when code execution fails\n */\nexport class ExecutionError extends ComputeError {\n /** Error code */\n readonly code = 'EXECUTION_ERROR';\n\n /** Execution errors are generally not retryable */\n readonly isRetryable = false;\n\n /** Exit code from the failed execution */\n readonly exitCode: number;\n\n /**\n * Create a new ExecutionError\n * \n * @param message Error message\n * @param provider Provider identifier\n * @param exitCode Exit code from the execution\n * @param sandboxId Optional sandbox identifier\n */\n constructor(message: string, provider: string, exitCode: number, sandboxId?: string) {\n super(message, provider, sandboxId);\n this.exitCode = exitCode;\n }\n}\n\n/**\n * Error thrown when code execution times out\n */\nexport class TimeoutError extends ComputeError {\n /** Error code */\n readonly code = 'TIMEOUT_ERROR';\n\n /** Timeout errors may be retryable with a longer timeout */\n readonly isRetryable = true;\n\n /** Timeout duration in milliseconds */\n readonly timeoutMs: number;\n\n /**\n * Create a new TimeoutError\n * \n * @param message Error message\n * @param provider Provider identifier\n * @param timeoutMs Timeout duration in milliseconds\n * @param sandboxId Optional sandbox identifier\n */\n constructor(message: string, provider: string, timeoutMs: number, sandboxId?: string) {\n super(message, provider, sandboxId);\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Error thrown when provider-specific operations fail\n */\nexport class ProviderError extends ComputeError {\n /** Error code */\n readonly code = 'PROVIDER_ERROR';\n\n /** Provider errors may be retryable */\n readonly isRetryable = true;\n\n /** Original error from the provider */\n readonly originalError?: Error;\n\n /**\n * Create a new ProviderError\n * \n * @param message Error message\n * @param provider Provider identifier\n * @param originalError Optional original error from the provider\n * @param sandboxId Optional sandbox identifier\n */\n constructor(message: string, provider: string, originalError?: Error, sandboxId?: string) {\n super(message, provider, sandboxId);\n this.originalError = originalError;\n }\n}\n\n/**\n * Error thrown when configuration is invalid\n */\nexport class ConfigurationError extends ComputeError {\n /** Error code */\n readonly code = 'CONFIGURATION_ERROR';\n\n /** Configuration errors are not retryable without changes */\n readonly isRetryable = false;\n\n /**\n * Create a new ConfigurationError\n * \n * @param message Error message\n * @param provider Provider identifier\n * @param sandboxId Optional sandbox identifier\n */\n constructor(message: string, provider: string, sandboxId?: string) {\n super(message, provider, sandboxId);\n }\n}\n\n/**\n * Error thrown when authentication fails\n */\nexport class AuthenticationError extends ComputeError {\n /** Error code */\n readonly code = 'AUTHENTICATION_ERROR';\n\n /** Authentication errors are not retryable without new credentials */\n readonly isRetryable = false;\n\n /**\n * Create a new AuthenticationError\n * \n * @param message Error message\n * @param provider Provider identifier\n * @param sandboxId Optional sandbox identifier\n */\n constructor(message: string, provider: string, sandboxId?: string) {\n super(message, provider, sandboxId);\n }\n}\n\n/**\n * Error thrown when the provider is not available\n */\nexport class ProviderUnavailableError extends ComputeError {\n /** Error code */\n readonly code = 'PROVIDER_UNAVAILABLE';\n\n /** Provider unavailability may be temporary */\n readonly isRetryable = true;\n\n /**\n * Create a new ProviderUnavailableError\n * \n * @param message Error message\n * @param provider Provider identifier\n * @param sandboxId Optional sandbox identifier\n */\n constructor(message: string, provider: string, sandboxId?: string) {\n super(message, provider, sandboxId);\n }\n}\n","/**\n * ComputeSDK Configuration Management\n * \n * This file manages configuration and provider selection logic.\n */\n\nimport { SandboxConfig, ProviderType, Runtime, ContainerConfig } from './types';\nimport { ConfigurationError } from './errors';\n\n// Global type declarations for platform detection\ndeclare global {\n var DurableObject: any;\n var WebSocketPair: any;\n}\n\n// Default configuration values\nexport const DEFAULT_TIMEOUT = 300000; // 5 minutes in milliseconds\n\n/**\n * Environment variable names for provider API keys\n */\nexport const ENV_KEYS = {\n E2B: 'E2B_API_KEY',\n VERCEL: 'VERCEL_TOKEN',\n CLOUDFLARE: 'CLOUDFLARE_API_TOKEN',\n FLY: 'FLY_API_TOKEN',\n};\n\n/**\n * Detect if running in Cloudflare Workers environment\n * \n * @returns True if running in Cloudflare Workers\n */\nexport function isCloudflareWorkers(): boolean {\n return typeof DurableObject !== 'undefined' && \n typeof WebSocketPair !== 'undefined' &&\n typeof caches !== 'undefined';\n}\n\n/**\n * Detect available providers based on environment variables\n * \n * @returns Array of available provider types\n */\nexport function detectAvailableProviders(): ProviderType[] {\n const available: ProviderType[] = [];\n\n if (process.env[ENV_KEYS.E2B]) {\n available.push('e2b');\n }\n\n if (process.env[ENV_KEYS.VERCEL]) {\n available.push('vercel');\n }\n\n // Cloudflare can be detected by environment OR API key\n if (isCloudflareWorkers() || process.env[ENV_KEYS.CLOUDFLARE]) {\n available.push('cloudflare');\n }\n\n if (process.env[ENV_KEYS.FLY]) {\n available.push('fly');\n }\n\n return available;\n}\n\n/**\n * Auto-select the best provider based on available API keys\n * \n * @returns Selected provider type or undefined if none available\n */\nexport function autoSelectProvider(): ProviderType | undefined {\n const available = detectAvailableProviders();\n return available.length > 0 ? available[0] : undefined;\n}\n\n/**\n * Validate and normalize container configuration\n * \n * @param container Container configuration or image string\n * @returns Normalized container configuration\n */\nexport function normalizeContainerConfig(container: string | ContainerConfig | undefined): ContainerConfig | undefined {\n if (!container) {\n return undefined;\n }\n\n if (typeof container === 'string') {\n return { image: container };\n }\n\n if (!container.image) {\n throw new ConfigurationError('Container configuration must include an image', 'config');\n }\n\n return container;\n}\n\n/**\n * Get the appropriate runtime based on provider and configuration\n * \n * @param provider Provider type\n * @param runtime Optional runtime preference\n * @returns Selected runtime\n */\nexport function getDefaultRuntime(provider: ProviderType, runtime?: Runtime): Runtime {\n if (runtime) {\n return runtime;\n }\n\n // Provider-specific defaults\n switch (provider) {\n case 'e2b':\n return 'python';\n case 'vercel':\n return 'node';\n case 'cloudflare':\n case 'fly':\n throw new ConfigurationError(\n `Container-based provider '${provider}' requires explicit runtime or container configuration`,\n provider\n );\n default:\n return 'node';\n }\n}\n\n/**\n * Validate API key for selected provider\n * \n * @param provider Provider type\n * @throws AuthenticationError if API key is missing\n */\nexport function validateProviderApiKey(provider: ProviderType): void {\n let envKey: string;\n\n switch (provider) {\n case 'e2b':\n envKey = ENV_KEYS.E2B;\n break;\n case 'vercel':\n envKey = ENV_KEYS.VERCEL;\n break;\n case 'cloudflare':\n // Cloudflare can work without API key if in Workers environment\n if (isCloudflareWorkers()) {\n return;\n }\n envKey = ENV_KEYS.CLOUDFLARE;\n break;\n case 'fly':\n envKey = ENV_KEYS.FLY;\n break;\n case 'auto':\n return; // Will be handled by auto-selection\n default:\n throw new ConfigurationError(`Unknown provider: ${provider}`, 'config');\n }\n\n if (!process.env[envKey]) {\n const available = detectAvailableProviders();\n const suggestions = available.length > 0\n ? `Available providers: ${available.join(', ')}`\n : `No provider API keys found. Set ${Object.values(ENV_KEYS).join(' or ')} environment variables.`;\n\n throw new ConfigurationError(\n `Missing API key for provider '${provider}'. ${suggestions}`,\n provider\n );\n }\n}\n\n/**\n * Normalize and validate sandbox configuration\n * \n * @param config User-provided configuration\n * @returns Normalized configuration with defaults applied\n */\nexport function normalizeSandboxConfig(config?: Partial<SandboxConfig>): SandboxConfig {\n const normalized: SandboxConfig = {\n provider: config?.provider || 'auto',\n timeout: config?.timeout || DEFAULT_TIMEOUT,\n };\n\n // Handle provider selection\n if (normalized.provider === 'auto') {\n const autoProvider = autoSelectProvider();\n if (!autoProvider) {\n throw new ConfigurationError(\n `No provider API keys found. Set one of the following environment variables: ${Object.values(ENV_KEYS).join(', ')}`,\n 'config'\n );\n }\n normalized.provider = autoProvider;\n } else {\n validateProviderApiKey(normalized.provider!);\n }\n\n // Handle runtime selection\n if (config?.runtime) {\n normalized.runtime = config.runtime;\n } else if (!config?.container) {\n normalized.runtime = getDefaultRuntime(normalized.provider!);\n }\n\n // Handle container configuration\n if (config?.container) {\n normalized.container = normalizeContainerConfig(config.container);\n }\n\n return normalized;\n}\n","/**\n * Utility functions for ComputeSDK\n */\n\nimport type { ExecuteSandboxParams, ExecutionResult, ComputeSandbox } from './types';\n\n/**\n * Execute code in a sandbox\n */\nexport async function executeSandbox(params: ExecuteSandboxParams): Promise<ExecutionResult> {\n return await params.sandbox.execute(params.code, params.runtime);\n}\n\n/**\n * Retry function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n baseDelay: number = 1000\n): Promise<T> {\n let lastError: Error;\n \n for (let i = 0; i < maxRetries; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n \n if (i === maxRetries - 1) {\n throw lastError;\n }\n \n // Exponential backoff\n const delay = baseDelay * Math.pow(2, i);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n \n throw lastError!;\n}","/**\n * ComputeSDK Provider Registry\n * \n * This file implements the provider registry for managing multiple providers.\n */\n\nimport { ComputeSandbox, ProviderMap, ProviderRegistry, Runtime } from './types';\nimport { ConfigurationError } from './errors';\n\n/**\n * Create a provider registry for managing multiple providers\n * \n * @param providers Map of provider factories\n * @returns Provider registry instance\n */\nexport function createComputeRegistry(providers: ProviderMap): ProviderRegistry {\n // Validate provider map\n if (!providers || Object.keys(providers).length === 0) {\n throw new ConfigurationError('Provider registry requires at least one provider', 'registry');\n }\n\n /**\n * Get a sandbox by ID string\n * \n * Format: \"<provider>:<runtime>\" or \"<provider>:<container-image>\"\n * Examples: \"e2b:python\", \"vercel:node\", \"fly:python:3.9\"\n * \n * @param id Sandbox identifier string\n * @returns Configured sandbox instance\n */\n function sandbox(id: string): ComputeSandbox {\n const parts = id.split(':');\n\n if (parts.length < 1) {\n throw new ConfigurationError(`Invalid sandbox ID format: ${id}`, 'registry');\n }\n\n const providerName = parts[0];\n const providerFactory = providers[providerName];\n\n if (!providerFactory) {\n const availableProviders = Object.keys(providers).join(', ');\n throw new ConfigurationError(\n `Provider '${providerName}' not found in registry. Available providers: ${availableProviders}`,\n 'registry'\n );\n }\n\n // Handle different ID formats\n if (parts.length === 1) {\n // Just provider name, use default configuration\n return providerFactory();\n } else if (parts.length === 2) {\n // Provider with runtime or container image\n const runtimeOrImage = parts[1];\n\n // Check if it's a runtime\n if (isRuntime(runtimeOrImage)) {\n return providerFactory({ runtime: runtimeOrImage });\n }\n\n // Otherwise, treat as container image\n return providerFactory({ container: { image: runtimeOrImage } });\n } else {\n // Handle more complex formats (container with tag)\n const containerImage = parts.slice(1).join(':');\n return providerFactory({ container: { image: containerImage } });\n }\n }\n\n return { sandbox };\n}\n\n/**\n * Check if a string is a valid runtime\n * \n * @param value String to check\n * @returns Whether the string is a valid runtime\n */\nfunction isRuntime(value: string): value is Runtime {\n return ['node', 'python'].includes(value);\n}\n","/**\n * ComputeSDK Base Provider\n * \n * This file contains the base provider implementation that all\n * specific provider implementations extend.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n ComputeSpecification,\n ComputeSandbox,\n Runtime,\n ExecutionResult,\n SandboxInfo\n} from '../types';\nimport { ProviderError, TimeoutError } from '../errors';\n\n/**\n * Base implementation of the ComputeSandbox interface\n * \n * Provides common functionality and wraps provider-specific implementations.\n */\nexport abstract class BaseProvider implements ComputeSandbox, ComputeSpecification {\n /** Specification version */\n public readonly specificationVersion = 'v1';\n\n /** Provider identifier */\n public readonly provider: string;\n\n /** Sandbox identifier */\n public readonly sandboxId: string;\n\n /** Execution timeout in milliseconds */\n protected readonly timeout: number;\n\n /**\n * Create a new base provider\n * \n * @param provider Provider identifier\n * @param timeout Execution timeout in milliseconds\n */\n constructor(provider: string, timeout: number) {\n this.provider = provider;\n this.sandboxId = uuidv4();\n this.timeout = timeout;\n }\n\n /**\n * Execute code in the sandbox\n * \n * @param code Code to execute\n * @param runtime Optional runtime to use\n * @returns Execution result\n */\n public async execute(code: string, runtime?: Runtime): Promise<ExecutionResult> {\n const startTime = Date.now();\n\n try {\n // Create a timeout promise that rejects after the timeout\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new TimeoutError(\n `Execution timed out after ${this.timeout}ms`,\n this.provider,\n this.timeout,\n this.sandboxId\n ));\n }, this.timeout);\n });\n\n // Execute the code with a timeout\n const result = await Promise.race([\n this.doExecute(code, runtime),\n timeoutPromise\n ]);\n\n // Calculate execution time\n const executionTime = Date.now() - startTime;\n\n return {\n ...result,\n executionTime,\n sandboxId: this.sandboxId,\n provider: this.provider\n };\n } catch (error) {\n // If the error is already a ComputeError, rethrow it\n if (error instanceof Error && error.name.includes('Error') && 'code' in error) {\n throw error;\n }\n\n // Otherwise, wrap it in a ProviderError\n throw new ProviderError(\n `Execution failed: ${error instanceof Error ? error.message : String(error)}`,\n this.provider,\n error instanceof Error ? error : undefined,\n this.sandboxId\n );\n }\n }\n\n /**\n * Kill the sandbox\n * \n * @returns Promise that resolves when the sandbox is killed\n */\n public async kill(): Promise<void> {\n try {\n await this.doKill();\n } catch (error) {\n throw new ProviderError(\n `Failed to kill sandbox: ${error instanceof Error ? error.message : String(error)}`,\n this.provider,\n error instanceof Error ? error : undefined,\n this.sandboxId\n );\n }\n }\n\n /**\n * Get information about the sandbox\n * \n * @returns Sandbox information\n */\n public async getInfo(): Promise<SandboxInfo> {\n try {\n return await this.doGetInfo();\n } catch (error) {\n throw new ProviderError(\n `Failed to get sandbox info: ${error instanceof Error ? error.message : String(error)}`,\n this.provider,\n error instanceof Error ? error : undefined,\n this.sandboxId\n );\n }\n }\n\n /**\n * Provider-specific implementation of code execution\n * \n * @param code Code to execute\n * @param runtime Optional runtime to use\n * @returns Execution result\n */\n public abstract doExecute(code: string, runtime?: Runtime): Promise<ExecutionResult>;\n\n /**\n * Provider-specific implementation of sandbox termination\n * \n * @returns Promise that resolves when the sandbox is killed\n */\n public abstract doKill(): Promise<void>;\n\n /**\n * Provider-specific implementation of retrieving sandbox information\n * \n * @returns Sandbox information\n */\n public abstract doGetInfo(): Promise<SandboxInfo>;\n}\n","import type { \n SandboxConfig, \n ComputeSandbox, \n ProviderType,\n Runtime,\n ContainerConfig\n} from './types';\nimport { \n ConfigurationError, \n AuthenticationError \n} from './errors';\nimport { \n normalizeSandboxConfig, \n detectAvailableProviders \n} from './config';\n\nexport class ComputeSDK {\n /**\n * Create a new sandbox with the specified configuration\n * \n * @param config Optional sandbox configuration\n * @returns Configured sandbox instance\n */\n static createSandbox(config?: Partial<SandboxConfig>): ComputeSandbox {\n const normalizedConfig = normalizeSandboxConfig(config);\n \n // Try to dynamically load the provider\n const providerName = normalizedConfig.provider;\n \n try {\n // Attempt to load provider package\n const providerPackage = `@computesdk/${providerName}`;\n const provider = require(providerPackage);\n \n // Get the factory function\n const factory = provider[providerName!];\n if (!factory) {\n throw new ConfigurationError(\n `Provider package ${providerPackage} does not export a '${providerName}' function`,\n 'sdk'\n );\n }\n \n // Create the sandbox based on provider type\n if (providerName === 'cloudflare') {\n // Cloudflare requires env parameter with Durable Object namespace\n // This would need to be passed in from the Worker context\n throw new ConfigurationError(\n 'Cloudflare provider requires env parameter with Sandbox namespace. ' +\n 'Use createSandbox({ provider: \"cloudflare\", env: yourEnv }) from within a Worker.',\n 'sdk'\n );\n } else if (providerName === 'fly') {\n if (!normalizedConfig.container) {\n throw new ConfigurationError(\n `${providerName} provider requires container configuration`,\n 'sdk'\n );\n }\n return factory({ ...normalizedConfig, container: normalizedConfig.container });\n } else {\n return factory(normalizedConfig);\n }\n } catch (error) {\n if (error instanceof ConfigurationError) {\n throw error;\n }\n \n // Check if it's a missing package error\n if ((error as any).code === 'MODULE_NOT_FOUND') {\n throw new ConfigurationError(\n `Provider '${providerName}' not installed. Run: npm install @computesdk/${providerName}`,\n 'sdk'\n );\n }\n \n throw new ConfigurationError(\n `Failed to load provider '${providerName}': ${(error as Error).message}`,\n 'sdk'\n );\n }\n }\n \n /**\n * Detect available providers based on environment variables\n * \n * @returns Array of available provider types\n */\n static detectProviders(): ProviderType[] {\n return detectAvailableProviders();\n }\n}"],"mappings":"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","names":["uuidv4"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/sandbox.ts","../src/compute.ts","../src/request-handler.ts","../src/factory.ts"],"sourcesContent":["/**\n * ComputeSDK Core\n * \n * Clean Provider/Sandbox separation architecture with extensible compute.* API\n */\n\n// Export all types\nexport * from './types';\n\n// Export compute singleton - the main API\nexport { compute } from './compute';\n\n// Export request handler for web framework integration\nexport { handleComputeRequest } from './request-handler';\n\n// Export compute request/response types\nexport type { \n ComputeRequest, \n ComputeResponse, \n HandleComputeRequestParams \n} from './request-handler';\n\n// Export managers for advanced usage and testing\nexport { SandboxManager } from './sandbox';\n\n// Export provider factory for creating custom providers\nexport { createProvider } from './factory';\nexport type { ProviderConfig, SandboxMethods } from './factory';\nexport type { SandboxManagerMethods } from './types';\n\n// Test suite is available separately via @computesdk/test-utils package","/**\n * Sandbox Management - Provider-Centric Approach\n * \n * No registry - providers are the single source of truth\n */\n\nimport type { Sandbox, Provider, CreateSandboxOptions } from './types';\n\n/**\n * Sandbox manager - thin wrapper around provider APIs\n */\nexport class SandboxManager {\n /**\n * Create a sandbox from a provider\n */\n async create(provider: Provider, options?: CreateSandboxOptions): Promise<Sandbox> {\n // Provider creates and manages the sandbox - no local tracking\n return await provider.sandbox.create(options);\n }\n\n /**\n * Get an existing sandbox by ID from a provider\n */\n async getById(provider: Provider, sandboxId: string): Promise<Sandbox | null> {\n // Always fetch from provider API - provider is source of truth\n return await provider.sandbox.getById(sandboxId);\n }\n\n /**\n * List all active sandboxes from a provider\n */\n async list(provider: Provider): Promise<Sandbox[]> {\n // Always fetch from provider API - provider is source of truth\n return await provider.sandbox.list();\n }\n\n /**\n * Destroy a sandbox via a provider\n */\n async destroy(provider: Provider, sandboxId: string): Promise<void> {\n // Provider handles destruction - no local cleanup needed\n return await provider.sandbox.destroy(sandboxId);\n }\n}","/**\n * Compute Singleton - Main API Orchestrator\n * \n * Provides the unified compute.* API and delegates to specialized managers\n */\n\nimport type { ComputeAPI, CreateSandboxParams, CreateSandboxParamsWithOptionalProvider, ComputeConfig, Sandbox, Provider } from './types';\nimport { SandboxManager } from './sandbox';\n\n/**\n * Compute singleton implementation - orchestrates all compute operations\n */\nclass ComputeManager implements ComputeAPI {\n private sandboxManager = new SandboxManager();\n private config: ComputeConfig | null = null;\n\n /**\n * Set default configuration\n */\n setConfig(config: ComputeConfig): void {\n this.config = config;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ComputeConfig | null {\n return this.config;\n }\n\n /**\n * Clear current configuration\n */\n clearConfig(): void {\n this.config = null;\n }\n\n /**\n * Get the default provider, throwing if not configured\n */\n private getDefaultProvider(): Provider {\n if (!this.config?.provider) {\n throw new Error(\n 'No default provider configured. Either call compute.setConfig({ provider }) or pass provider explicitly.'\n );\n }\n return this.config.provider;\n }\n\n sandbox = {\n /**\n * Create a sandbox from a provider (or default provider if configured)\n * \n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { compute } from 'computesdk'\n * \n * // With explicit provider\n * const sandbox = await compute.sandbox.create({\n * provider: e2b({ apiKey: 'your-key' })\n * })\n * \n * // With default provider\n * compute.setConfig({ provider: e2b({ apiKey: 'your-key' }) })\n * const sandbox = await compute.sandbox.create({})\n * ```\n */\n create: async (params: CreateSandboxParams | CreateSandboxParamsWithOptionalProvider): Promise<Sandbox> => {\n const provider = 'provider' in params && params.provider ? params.provider : this.getDefaultProvider();\n const options = params.options;\n return await this.sandboxManager.create(provider, options);\n },\n\n /**\n * Get an existing sandbox by ID from a provider (or default provider if configured)\n */\n getById: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<Sandbox | null> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await this.sandboxManager.getById(provider, providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await this.sandboxManager.getById(providerOrSandboxId, sandboxId);\n }\n },\n\n /**\n * List all active sandboxes from a provider (or default provider if configured)\n */\n list: async (provider?: Provider): Promise<Sandbox[]> => {\n const actualProvider = provider || this.getDefaultProvider();\n return await this.sandboxManager.list(actualProvider);\n },\n\n /**\n * Destroy a sandbox via a provider (or default provider if configured)\n */\n destroy: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<void> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await this.sandboxManager.destroy(provider, providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await this.sandboxManager.destroy(providerOrSandboxId, sandboxId);\n }\n }\n };\n\n // Future: compute.blob.*, compute.database.*, compute.git.* will be added here\n // blob = new BlobManager();\n // database = new DatabaseManager(); \n // git = new GitManager();\n\n /**\n * Get the sandbox manager (useful for testing)\n */\n getSandboxManager(): SandboxManager {\n return this.sandboxManager;\n }\n}\n\n/**\n * Singleton instance - the main API\n */\nexport const compute: ComputeAPI = new ComputeManager();\n\n","/**\n * Request Handler for Web Framework Integration\n * \n * Maps web requests to ComputeSDK operations with comprehensive support for:\n * - Sandbox management (create, destroy, getInfo)\n * - Code execution\n * - Filesystem operations\n * - Terminal operations\n */\n\nimport type { Provider, Runtime, Sandbox } from './types';\nimport { compute } from './compute';\n\n/**\n * Terminal callback manager for handling multiple SSE connections\n */\nclass TerminalCallbackManager {\n private static instance: TerminalCallbackManager;\n private callbacks = new Map<string, Map<string, (data: Uint8Array) => void>>();\n private terminals = new Map<string, any>();\n\n static getInstance(): TerminalCallbackManager {\n if (!TerminalCallbackManager.instance) {\n TerminalCallbackManager.instance = new TerminalCallbackManager();\n }\n return TerminalCallbackManager.instance;\n }\n\n /**\n * Add a callback for a terminal\n */\n addCallback(terminalId: string, connectionId: string, callback: (data: Uint8Array) => void, terminal: any): void {\n // Initialize terminal callbacks if not exists\n if (!this.callbacks.has(terminalId)) {\n this.callbacks.set(terminalId, new Map());\n this.terminals.set(terminalId, terminal);\n \n // Set up the master onData callback that broadcasts to all connections\n terminal.onData = (data: Uint8Array) => {\n const terminalCallbacks = this.callbacks.get(terminalId);\n if (terminalCallbacks) {\n terminalCallbacks.forEach(cb => {\n try {\n cb(data);\n } catch (error) {\n // Ignore errors from individual callbacks\n console.warn('Terminal callback error:', error);\n }\n });\n }\n };\n }\n\n // Add this connection's callback\n this.callbacks.get(terminalId)!.set(connectionId, callback);\n }\n\n /**\n * Remove a callback for a terminal\n */\n removeCallback(terminalId: string, connectionId: string): void {\n const terminalCallbacks = this.callbacks.get(terminalId);\n if (terminalCallbacks) {\n terminalCallbacks.delete(connectionId);\n \n // If no more callbacks, clean up the terminal's onData\n if (terminalCallbacks.size === 0) {\n const terminal = this.terminals.get(terminalId);\n if (terminal) {\n terminal.onData = undefined;\n }\n this.callbacks.delete(terminalId);\n this.terminals.delete(terminalId);\n }\n }\n }\n\n /**\n * Get number of active connections for a terminal\n */\n getConnectionCount(terminalId: string): number {\n return this.callbacks.get(terminalId)?.size || 0;\n }\n}\n\n/**\n * Extended request structure supporting all SDK capabilities\n */\nexport interface ComputeRequest {\n /** Type of operation to perform */\n action: \n // Sandbox operations\n | 'compute.sandbox.create' \n | 'compute.sandbox.destroy' \n | 'compute.sandbox.getInfo'\n | 'compute.sandbox.list'\n // Code execution\n | 'compute.sandbox.runCode'\n | 'compute.sandbox.runCommand'\n // Filesystem operations\n | 'compute.sandbox.filesystem.readFile'\n | 'compute.sandbox.filesystem.writeFile'\n | 'compute.sandbox.filesystem.mkdir'\n | 'compute.sandbox.filesystem.readdir'\n | 'compute.sandbox.filesystem.exists'\n | 'compute.sandbox.filesystem.remove'\n // Terminal operations\n | 'compute.sandbox.terminal.create'\n | 'compute.sandbox.terminal.getById'\n | 'compute.sandbox.terminal.list'\n | 'compute.sandbox.terminal.destroy'\n // Terminal I/O operations\n | 'compute.sandbox.terminal.write'\n | 'compute.sandbox.terminal.resize'\n | 'compute.sandbox.terminal.kill';\n\n /** Sandbox ID (required for operations on existing sandboxes) */\n sandboxId?: string;\n \n /** Code to execute (for runCode action) */\n code?: string;\n \n /** Command to run (for runCommand action) */\n command?: string;\n \n /** Command arguments (for runCommand action) */\n args?: string[];\n \n /** Runtime environment */\n runtime?: Runtime;\n \n /** File path (for filesystem operations) */\n path?: string;\n \n /** File content (for writeFile action) */\n content?: string;\n \n /** Terminal options (for terminal.create) */\n terminalOptions?: {\n command?: string;\n cols?: number;\n rows?: number;\n env?: Record<string, string>;\n };\n\n /** Terminal ID (for terminal operations) */\n terminalId?: string;\n\n /** Terminal input data (for terminal.write) */\n data?: string | Uint8Array;\n\n /** Terminal resize dimensions (for terminal.resize) */\n cols?: number;\n rows?: number;\n \n /** Additional sandbox creation options */\n options?: {\n runtime?: Runtime;\n timeout?: number;\n sandboxId?: string;\n };\n}\n\n/**\n * Response structure for compute operations\n */\nexport interface ComputeResponse {\n /** Whether the operation was successful */\n success: boolean;\n /** Error message if operation failed */\n error?: string;\n /** Sandbox ID involved in the operation */\n sandboxId: string;\n /** Provider that handled the operation */\n provider: string;\n \n /** Execution result (for runCode/runCommand actions) */\n result?: {\n stdout: string;\n stderr: string;\n exitCode: number;\n executionTime: number;\n };\n \n /** Sandbox info (for getInfo action) */\n info?: {\n id: string;\n provider: string;\n runtime: Runtime;\n status: string;\n createdAt: string;\n timeout: number;\n metadata?: Record<string, any>;\n };\n \n /** File content (for readFile action) */\n fileContent?: string;\n \n /** Directory listing (for readdir action) */\n files?: Array<{\n name: string;\n path: string;\n isDirectory: boolean;\n size: number;\n lastModified: string;\n }>;\n \n /** File/directory exists (for exists action) */\n exists?: boolean;\n \n /** Sandbox list (for list action) */\n sandboxes?: Array<{\n sandboxId: string;\n provider: string;\n }>;\n \n /** Terminal session (for terminal.create action) */\n terminal?: {\n pid: number;\n command: string;\n status: string;\n cols: number;\n rows: number;\n };\n \n /** Terminal sessions (for terminal.list action) */\n terminals?: Array<{\n pid: number;\n command: string;\n status: string;\n cols: number;\n rows: number;\n }>;\n\n /** WebSocket connection info (for terminal.connect action) */\n websocket?: {\n url: string;\n headers?: Record<string, string>;\n protocols?: string[];\n };\n}\n\n/**\n * Parameters for handleComputeRequest\n */\nexport interface HandleComputeRequestParams {\n /** The compute request to handle */\n request: ComputeRequest;\n /** Provider to use for the operation */\n provider: Provider;\n}\n\n/**\n * Parameters for handleHttpComputeRequest\n */\nexport interface HandleHttpComputeRequestParams {\n /** The HTTP request to handle */\n request: Request;\n /** Provider to use for the operation */\n provider: Provider;\n}\n\n/**\n * Handle HTTP compute requests with automatic SSE detection\n * \n * This is the main entry point for web frameworks. It automatically detects\n * different request types and routes them appropriately:\n * - GET with action=terminal.stream: Returns SSE stream for terminal output\n * - POST: Regular compute operations (including terminal I/O)\n * \n * @example\n * ```typescript\n * // Framework implementation (works for Next.js, Nuxt, SvelteKit, etc.)\n * export async function GET(request: Request) {\n * return handleHttpComputeRequest({\n * request,\n * provider: e2b({ apiKey: process.env.E2B_API_KEY })\n * });\n * }\n * \n * export async function POST(request: Request) {\n * return handleHttpComputeRequest({\n * request,\n * provider: e2b({ apiKey: process.env.E2B_API_KEY })\n * });\n * }\n * \n * // Client usage\n * // 1. Create terminal (HTTP POST)\n * fetch('/api/compute', {\n * method: 'POST',\n * body: JSON.stringify({ action: 'compute.sandbox.terminal.create', sandboxId: '123' })\n * });\n * \n * // 2. Stream terminal output (EventSource GET)\n * const eventSource = new EventSource('/api/compute?action=terminal.stream&terminalId=456');\n * eventSource.onmessage = (event) => xtermInstance.write(JSON.parse(event.data));\n * \n * // 3. Send terminal input (HTTP POST)\n * fetch('/api/compute', {\n * method: 'POST',\n * body: JSON.stringify({ action: 'compute.sandbox.terminal.write', terminalId: '456', data: 'ls -la\\n' })\n * });\n * ```\n */\nexport async function handleHttpComputeRequest(params: HandleHttpComputeRequestParams): Promise<Response> {\n const { request, provider } = params;\n \n // Handle GET requests (SSE streaming)\n if (request.method === 'GET') {\n const url = new URL(request.url);\n const action = url.searchParams.get('action');\n \n if (action === 'terminal.stream') {\n return handleTerminalStream(request, provider);\n }\n \n // Other GET requests not supported\n return Response.json({\n success: false,\n error: 'GET requests only supported for terminal.stream action',\n sandboxId: '',\n provider: provider.name\n }, { status: 400 });\n }\n \n // Handle POST requests (regular compute operations)\n try {\n const body = await request.json();\n const computeRequest = body as ComputeRequest;\n \n // Use existing handleComputeRequest function\n const response = await handleComputeRequest({\n request: computeRequest,\n provider\n });\n \n return Response.json(response);\n \n } catch (error) {\n return Response.json({\n success: false,\n error: error instanceof Error ? error.message : 'Invalid request format',\n sandboxId: '',\n provider: provider.name\n }, { status: 400 });\n }\n}\n\n/**\n * Handle terminal SSE streaming\n */\nasync function handleTerminalStream(request: Request, provider: Provider): Promise<Response> {\n const url = new URL(request.url);\n const sandboxId = url.searchParams.get('sandboxId');\n const terminalId = url.searchParams.get('terminalId');\n \n if (!sandboxId || !terminalId) {\n return Response.json({\n success: false,\n error: 'sandboxId and terminalId are required for terminal streaming',\n sandboxId: sandboxId || '',\n provider: provider.name\n }, { status: 400 });\n }\n \n try {\n // Get the sandbox and terminal\n const sandbox = await compute.sandbox.getById(provider, sandboxId);\n if (!sandbox) {\n return Response.json({\n success: false,\n error: `Sandbox with ID ${sandboxId} not found`,\n sandboxId,\n provider: provider.name\n }, { status: 404 });\n }\n \n const terminal = await sandbox.terminal.getById(terminalId);\n if (!terminal) {\n return Response.json({\n success: false,\n error: `Terminal with ID ${terminalId} not found`,\n sandboxId,\n provider: provider.name\n }, { status: 404 });\n }\n \n // Generate unique connection ID\n const connectionId = `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n const callbackManager = TerminalCallbackManager.getInstance();\n \n // Create SSE stream\n const stream = new ReadableStream({\n start(controller) {\n // Set up callback for this connection\n const callback = (data: Uint8Array) => {\n const dataArray = Array.from(data);\n const sseData = `data: ${JSON.stringify(dataArray)}\\n\\n`;\n controller.enqueue(new TextEncoder().encode(sseData));\n };\n \n // Register callback with manager\n callbackManager.addCallback(terminalId, connectionId, callback, terminal);\n \n // Send initial connection message\n const connectMsg = `data: ${JSON.stringify({ \n type: 'connected', \n terminalId, \n connectionId,\n activeConnections: callbackManager.getConnectionCount(terminalId)\n })}\\n\\n`;\n controller.enqueue(new TextEncoder().encode(connectMsg));\n },\n \n cancel() {\n // Clean up this connection's callback\n callbackManager.removeCallback(terminalId, connectionId);\n }\n });\n \n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Headers': 'Cache-Control'\n }\n });\n \n } catch (error) {\n return Response.json({\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create terminal stream',\n sandboxId,\n provider: provider.name\n }, { status: 500 });\n }\n}\n\n/**\n * Handle a compute request - unified API for web frameworks\n * \n * Maps web requests to ComputeSDK operations with full support for:\n * - All sandbox operations via compute.sandbox.*\n * - All filesystem operations via sandbox.filesystem.*\n * - All terminal operations via sandbox.terminal.*\n * \n * @example\n * ```typescript\n * // Execute code\n * const response = await handleComputeRequest({\n * request: { \n * action: 'sandbox.runCode', \n * code: 'print(\"hello\")',\n * sandboxId: 'existing-sandbox-id' // optional, creates new if not provided\n * },\n * provider: e2b({ apiKey: process.env.E2B_API_KEY })\n * });\n * \n * // Filesystem operations\n * const response = await handleComputeRequest({\n * request: { \n * action: 'filesystem.writeFile', \n * sandboxId: 'sandbox-id',\n * path: '/tmp/hello.py',\n * content: 'print(\"Hello from file!\")'\n * },\n * provider: e2b({ apiKey: process.env.E2B_API_KEY })\n * });\n * ```\n */\nexport async function handleComputeRequest(params: HandleComputeRequestParams): Promise<ComputeResponse> {\n const { request, provider } = params;\n \n try {\n // Helper function to get or create sandbox\n const getSandbox = async (sandboxId?: string): Promise<Sandbox> => {\n if (sandboxId) {\n const existingSandbox = await compute.sandbox.getById(provider, sandboxId);\n if (!existingSandbox) {\n throw new Error(`Sandbox with ID ${sandboxId} not found`);\n }\n return existingSandbox;\n } else {\n // Create new sandbox\n return await compute.sandbox.create({\n provider,\n options: request.options || { runtime: 'python' }\n });\n }\n };\n\n switch (request.action) {\n // Sandbox operations\n case 'compute.sandbox.create': {\n const sandbox = await compute.sandbox.create({\n provider,\n options: request.options || { runtime: 'python' }\n });\n\n return {\n success: true,\n sandboxId: sandbox.sandboxId,\n provider: provider.name\n };\n }\n\n case 'compute.sandbox.destroy': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for destroy action',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n await compute.sandbox.destroy(provider, request.sandboxId);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n case 'compute.sandbox.getInfo': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for getInfo action',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const info = await sandbox.getInfo();\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name,\n info: {\n id: info.id,\n provider: info.provider,\n runtime: info.runtime,\n status: info.status,\n createdAt: info.createdAt.toISOString(),\n timeout: info.timeout,\n metadata: info.metadata\n }\n };\n }\n\n case 'compute.sandbox.list': {\n const sandboxes = await compute.sandbox.list(provider);\n \n return {\n success: true,\n sandboxId: '',\n provider: provider.name,\n sandboxes: sandboxes.map(sandbox => ({\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider\n }))\n };\n }\n\n // Code execution\n case 'compute.sandbox.runCode': {\n if (!request.code) {\n return {\n success: false,\n error: 'Code is required for runCode action',\n sandboxId: request.sandboxId || '',\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const result = await sandbox.runCode(request.code, request.runtime);\n \n return {\n success: true,\n sandboxId: sandbox.sandboxId,\n provider: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime\n }\n };\n }\n\n case 'compute.sandbox.runCommand': {\n if (!request.command) {\n return {\n success: false,\n error: 'Command is required for runCommand action',\n sandboxId: request.sandboxId || '',\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const result = await sandbox.runCommand(request.command, request.args);\n \n return {\n success: true,\n sandboxId: sandbox.sandboxId,\n provider: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime\n }\n };\n }\n\n // Filesystem operations\n case 'compute.sandbox.filesystem.readFile': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for filesystem operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.path) {\n return {\n success: false,\n error: 'File path is required for readFile action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const content = await sandbox.filesystem.readFile(request.path);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name,\n fileContent: content\n };\n }\n\n case 'compute.sandbox.filesystem.writeFile': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for filesystem operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.path) {\n return {\n success: false,\n error: 'File path is required for writeFile action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n if (request.content === undefined) {\n return {\n success: false,\n error: 'File content is required for writeFile action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n await sandbox.filesystem.writeFile(request.path, request.content);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n case 'compute.sandbox.filesystem.mkdir': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for filesystem operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.path) {\n return {\n success: false,\n error: 'Directory path is required for mkdir action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n await sandbox.filesystem.mkdir(request.path);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n case 'compute.sandbox.filesystem.readdir': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for filesystem operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.path) {\n return {\n success: false,\n error: 'Directory path is required for readdir action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const entries = await sandbox.filesystem.readdir(request.path);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name,\n files: entries.map(entry => ({\n name: entry.name,\n path: entry.path,\n isDirectory: entry.isDirectory,\n size: entry.size,\n lastModified: entry.lastModified.toISOString()\n }))\n };\n }\n\n case 'compute.sandbox.filesystem.exists': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for filesystem operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.path) {\n return {\n success: false,\n error: 'Path is required for exists action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const exists = await sandbox.filesystem.exists(request.path);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name,\n exists\n };\n }\n\n case 'compute.sandbox.filesystem.remove': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for filesystem operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.path) {\n return {\n success: false,\n error: 'Path is required for remove action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n await sandbox.filesystem.remove(request.path);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n // Terminal operations\n case 'compute.sandbox.terminal.create': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for terminal operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const terminal = await sandbox.terminal.create(request.terminalOptions);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name,\n terminal: {\n pid: terminal.pid,\n command: terminal.command,\n status: terminal.status,\n cols: terminal.cols,\n rows: terminal.rows\n }\n };\n }\n\n case 'compute.sandbox.terminal.list': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for terminal operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const terminals = await sandbox.terminal.list();\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name,\n terminals: terminals.map(terminal => ({\n pid: terminal.pid,\n command: terminal.command,\n status: terminal.status,\n cols: terminal.cols,\n rows: terminal.rows\n }))\n };\n }\n\n case 'compute.sandbox.terminal.getById': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for terminal operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.terminalId) {\n return {\n success: false,\n error: 'Terminal ID is required for getById action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const terminal = await sandbox.terminal.getById(request.terminalId);\n \n if (!terminal) {\n return {\n success: false,\n error: `Terminal with ID ${request.terminalId} not found`,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name,\n terminal: {\n pid: terminal.pid,\n command: terminal.command,\n status: terminal.status,\n cols: terminal.cols,\n rows: terminal.rows\n }\n };\n }\n\n case 'compute.sandbox.terminal.destroy': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for terminal operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.terminalId) {\n return {\n success: false,\n error: 'Terminal ID is required for destroy action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n await sandbox.terminal.destroy(request.terminalId);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n // Terminal I/O operations\n case 'compute.sandbox.terminal.write': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for terminal operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.terminalId) {\n return {\n success: false,\n error: 'Terminal ID is required for write action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n if (!request.data) {\n return {\n success: false,\n error: 'Data is required for write action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const terminal = await sandbox.terminal.getById(request.terminalId);\n \n if (!terminal) {\n return {\n success: false,\n error: `Terminal with ID ${request.terminalId} not found`,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n await terminal.write(request.data);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n case 'compute.sandbox.terminal.resize': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for terminal operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.terminalId) {\n return {\n success: false,\n error: 'Terminal ID is required for resize action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n if (!request.cols || !request.rows) {\n return {\n success: false,\n error: 'Cols and rows are required for resize action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const terminal = await sandbox.terminal.getById(request.terminalId);\n \n if (!terminal) {\n return {\n success: false,\n error: `Terminal with ID ${request.terminalId} not found`,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n await terminal.resize(request.cols, request.rows);\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n case 'compute.sandbox.terminal.kill': {\n if (!request.sandboxId) {\n return {\n success: false,\n error: 'Sandbox ID is required for terminal operations',\n sandboxId: '',\n provider: provider.name\n };\n }\n\n if (!request.terminalId) {\n return {\n success: false,\n error: 'Terminal ID is required for kill action',\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n const sandbox = await getSandbox(request.sandboxId);\n const terminal = await sandbox.terminal.getById(request.terminalId);\n \n if (!terminal) {\n return {\n success: false,\n error: `Terminal with ID ${request.terminalId} not found`,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n await terminal.kill();\n \n return {\n success: true,\n sandboxId: request.sandboxId,\n provider: provider.name\n };\n }\n\n default:\n return {\n success: false,\n error: `Unknown action: ${(request as any).action}`,\n sandboxId: request.sandboxId || '',\n provider: provider.name\n };\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n sandboxId: request.sandboxId || '',\n provider: provider.name\n };\n }\n}\n\n/**\n * Handle WebSocket upgrade requests for real-time terminal I/O\n * \n * TODO: Implement WebSocket terminal connections\n * \n * This function should:\n * 1. Parse WebSocket upgrade request (sandboxId, terminalId from URL/headers)\n * 2. Validate the terminal session exists\n * 3. Upgrade HTTP connection to WebSocket\n * 4. Establish bidirectional proxy to provider's WebSocket\n * 5. Handle connection lifecycle (connect, disconnect, error)\n * \n * @example\n * ```typescript\n * // Framework usage (Next.js)\n * export async function GET(request: Request) {\n * if (request.headers.get('upgrade') === 'websocket') {\n * return handleComputeWebSocket(request, { provider })\n * }\n * return handleComputeRequest({ request, provider })\n * }\n * \n * // Frontend usage\n * const ws = new WebSocket('/api/compute?action=terminal.connect&sandboxId=123&terminalId=456')\n * ws.onmessage = (event) => console.log(event.data)\n * ws.send('ls -la\\n')\n * ```\n * \n * @param request - WebSocket upgrade request\n * @param params - Handler parameters (provider, etc.)\n * @returns WebSocket upgrade response\n */\nexport async function handleComputeWebSocket(\n _request: Request,\n _params: HandleComputeRequestParams\n): Promise<Response> {\n // TODO: Implement WebSocket terminal connections\n // This is a placeholder for future implementation\n \n return new Response('WebSocket terminal connections not yet implemented', {\n status: 501,\n statusText: 'Not Implemented'\n });\n}","/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\nimport type {\n Provider,\n ProviderSandboxManager,\n Sandbox,\n SandboxFileSystem,\n SandboxTerminal,\n SandboxInfo,\n ExecutionResult,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n TerminalSession,\n TerminalCreateOptions,\n} from './types/index.js';\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n \n // Instance operations (map to individual Sandbox methods)\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<ExecutionResult>;\n runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n \n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string) => Promise<void>;\n };\n \n // Optional terminal methods\n terminal?: {\n create: (sandbox: TSandbox, options?: TerminalCreateOptions) => Promise<{ terminal: any; terminalId: string }>;\n getById: (sandbox: TSandbox, terminalId: string) => Promise<{ terminal: any; terminalId: string } | null>;\n list: (sandbox: TSandbox) => Promise<Array<{ terminal: any; terminalId: string }>>;\n destroy: (sandbox: TSandbox, terminalId: string) => Promise<void>;\n // Terminal instance methods\n write: (sandbox: TSandbox, terminal: any, data: Uint8Array | string) => Promise<void>;\n resize: (sandbox: TSandbox, terminal: any, cols: number, rows: number) => Promise<void>;\n kill: (sandbox: TSandbox, terminal: any) => Promise<void>;\n };\n}\n\n/**\n * Provider configuration for createProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n };\n}\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n/**\n * Auto-generated terminal implementation that throws \"not supported\" errors\n */\nclass UnsupportedTerminal implements SandboxTerminal {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async create(_options?: TerminalCreateOptions): Promise<TerminalSession> {\n throw new Error(`Terminal operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async getById(_terminalId: string): Promise<TerminalSession | null> {\n throw new Error(`Terminal operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async list(): Promise<TerminalSession[]> {\n throw new Error(`Terminal operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async destroy(_terminalId: string): Promise<void> {\n throw new Error(`Terminal operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path);\n }\n}\n\n/**\n * Generated terminal session class - implements the TerminalSession interface\n */\nclass GeneratedTerminalSession<TSandbox = any> implements TerminalSession {\n readonly pid: number;\n readonly command: string;\n readonly status: 'running' | 'exited';\n readonly cols: number;\n readonly rows: number;\n onData?: (data: Uint8Array) => void;\n onExit?: (exitCode: number) => void;\n\n constructor(\n private terminal: any,\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['terminal']>,\n terminalId: string,\n command: string,\n cols: number = 80,\n rows: number = 24\n ) {\n this.pid = parseInt(terminalId);\n this.command = command;\n this.status = 'running';\n this.cols = cols;\n this.rows = rows;\n }\n\n async write(data: Uint8Array | string): Promise<void> {\n return this.methods.write(this.sandbox, this.terminal, data);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n return this.methods.resize(this.sandbox, this.terminal, cols, rows);\n }\n\n async kill(): Promise<void> {\n return this.methods.kill(this.sandbox, this.terminal);\n }\n}\n\n/**\n * Auto-generated terminal implementation that wraps provider methods\n */\nclass SupportedTerminal<TSandbox> implements SandboxTerminal {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['terminal']>\n ) {}\n\n async create(options?: TerminalCreateOptions): Promise<TerminalSession> {\n // Create a GeneratedTerminalSession first so we can set up callback forwarding\n let terminalSession: GeneratedTerminalSession<TSandbox>;\n \n // Create options with callback forwarding to the GeneratedTerminalSession\n const createOptions: TerminalCreateOptions = {\n ...options,\n onData: (data: Uint8Array) => {\n // Forward to the GeneratedTerminalSession's onData if set\n if (terminalSession?.onData) {\n terminalSession.onData(data);\n }\n },\n onExit: (exitCode: number) => {\n // Forward to the GeneratedTerminalSession's onExit if set\n if (terminalSession?.onExit) {\n terminalSession.onExit(exitCode);\n }\n }\n };\n\n const result = await this.methods.create(this.sandbox, createOptions);\n \n // Now create the GeneratedTerminalSession\n terminalSession = new GeneratedTerminalSession(\n result.terminal,\n this.sandbox,\n this.methods,\n result.terminalId,\n options?.command || 'bash',\n options?.cols || 80,\n options?.rows || 24\n );\n\n // Set the original callbacks on the terminal session\n terminalSession.onData = options?.onData;\n terminalSession.onExit = options?.onExit;\n\n return terminalSession;\n }\n\n async getById(terminalId: string): Promise<TerminalSession | null> {\n const result = await this.methods.getById(this.sandbox, terminalId);\n if (!result) return null;\n \n return new GeneratedTerminalSession(\n result.terminal,\n this.sandbox,\n this.methods,\n result.terminalId,\n 'bash', // Default command for existing terminals\n 80, // Default cols\n 24 // Default rows\n );\n }\n\n async list(): Promise<TerminalSession[]> {\n const results = await this.methods.list(this.sandbox);\n return results.map(result => new GeneratedTerminalSession(\n result.terminal,\n this.sandbox,\n this.methods,\n result.terminalId,\n 'bash', // Default command\n 80, // Default cols\n 24 // Default rows\n ));\n }\n\n async destroy(terminalId: string): Promise<void> {\n return this.methods.destroy(this.sandbox, terminalId);\n }\n}\n\n/**\n * Generated sandbox class - implements the Sandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements Sandbox {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n readonly terminal: SandboxTerminal;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n\n // Auto-detect terminal support\n if (methods.terminal) {\n this.terminal = new SupportedTerminal(sandbox, methods.terminal);\n } else {\n this.terminal = new UnsupportedTerminal(providerName);\n }\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<ExecutionResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(command: string, args?: string[]): Promise<ExecutionResult> {\n return await this.methods.runCommand(this.sandbox, command, args);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async kill(): Promise<void> {\n // For backward compatibility, kill() delegates to destroy()\n await this.destroy();\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager {\n private activeSandboxes: Map<string, GeneratedSandbox<TSandbox>> = new Map();\n\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>\n ) {}\n\n async create(options?: CreateSandboxOptions): Promise<Sandbox> {\n const result = await this.methods.create(this.config, options);\n const sandbox = new GeneratedSandbox(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy\n );\n \n this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async getById(sandboxId: string): Promise<Sandbox | null> {\n // Check active sandboxes first\n const existing = this.activeSandboxes.get(sandboxId);\n if (existing) {\n return existing;\n }\n\n // Try to reconnect\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n const sandbox = new GeneratedSandbox(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy\n );\n \n this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async list(): Promise<Sandbox[]> {\n const results = await this.methods.list(this.config);\n const sandboxes: Sandbox[] = [];\n\n for (const result of results) {\n let sandbox = this.activeSandboxes.get(result.sandboxId);\n if (!sandbox) {\n sandbox = new GeneratedSandbox(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy\n );\n this.activeSandboxes.set(result.sandboxId, sandbox);\n }\n sandboxes.push(sandbox);\n }\n\n return sandboxes;\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n this.activeSandboxes.delete(sandboxId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig> implements Provider {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox\n );\n }\n}\n\n/**\n * Create a provider from method definitions\n * \n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function createProvider<TSandbox, TConfig>(\n providerConfig: ProviderConfig<TSandbox, TConfig>\n): (config: TConfig) => Provider {\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}"],"mappings":"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","names":[]}
|