@computesdk/cloudflare 1.2.5 → 1.2.6

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/dist/index.js CHANGED
@@ -170,7 +170,13 @@ var cloudflare = (0, import_computesdk.createProvider)({
170
170
  const startTime = Date.now();
171
171
  try {
172
172
  const { sandbox, sandboxId } = cloudflareSandbox;
173
- const fullCommand = args.length > 0 ? `${command} ${args.join(" ")}` : command;
173
+ const quotedArgs = args.map((arg) => {
174
+ if (arg.includes(" ") || arg.includes('"') || arg.includes("'") || arg.includes("$") || arg.includes("`")) {
175
+ return `"${arg.replace(/"/g, '\\"')}"`;
176
+ }
177
+ return arg;
178
+ });
179
+ const fullCommand = quotedArgs.length > 0 ? `${command} ${quotedArgs.join(" ")}` : command;
174
180
  const execResult = await sandbox.exec(fullCommand);
175
181
  return {
176
182
  stdout: execResult.stdout || "",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Cloudflare Provider - Factory-based Implementation\n * \n * Full-featured provider using Cloudflare Sandbox SDK with all required methods.\n * Leverages Cloudflare's edge network and Durable Objects for sandboxed execution.\n */\n\nimport { getSandbox } from '@cloudflare/sandbox';\nimport { createProvider } from 'computesdk';\nimport type { \n ExecutionResult, \n SandboxInfo, \n Runtime,\n CreateSandboxOptions,\n FileEntry\n} from 'computesdk';\n\n/**\n * Cloudflare-specific configuration options\n */\nexport interface CloudflareConfig {\n /** Cloudflare Sandbox binding from Workers environment - the Durable Object binding */\n sandboxBinding?: any;\n /** Default runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Environment variables to pass to sandbox */\n envVars?: Record<string, string>;\n /** Base URL for preview URLs (defaults to worker domain) */\n baseUrl?: string;\n}\n\n/**\n * Cloudflare sandbox wrapper - wraps the Cloudflare Sandbox instance\n */\ninterface CloudflareSandbox {\n sandbox: any; // The actual Cloudflare Sandbox instance from getSandbox()\n sandboxId: string;\n exposedPorts: Map<number, string>; // Track exposed ports and their URLs\n}\n\n/**\n * Detect runtime from code content\n */\nfunction detectRuntime(code: string): Runtime {\n // Strong Python indicators\n if (code.includes('print(') || \n code.includes('import ') ||\n code.includes('def ') ||\n code.includes('sys.') ||\n code.includes('json.') ||\n code.includes('__') ||\n code.includes('f\"') ||\n code.includes(\"f'\") ||\n code.includes('raise ')) {\n return 'python';\n }\n\n // Strong Node.js indicators\n if (code.includes('console.log') || \n code.includes('process.') ||\n code.includes('require(') ||\n code.includes('module.exports') ||\n code.includes('__dirname') ||\n code.includes('__filename')) {\n return 'node';\n }\n\n // Default to Python for Cloudflare (matches their examples)\n return 'python';\n}\n\n/**\n * Create a Cloudflare provider instance using the factory pattern\n */\nexport const cloudflare = createProvider<CloudflareSandbox, CloudflareConfig>({\n name: 'cloudflare',\n methods: {\n sandbox: {\n // Collection operations (map to compute.sandbox.*)\n create: async (config: CloudflareConfig, options?: CreateSandboxOptions) => {\n // Validate Cloudflare Workers environment binding\n if (!config.sandboxBinding) {\n throw new Error(\n `Missing Cloudflare Sandbox binding. Provide 'sandboxBinding' in config with the Durable Object binding from your Cloudflare Workers environment (env.Sandbox). ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n\n const sandboxId = options?.sandboxId || `cf-sandbox-${Date.now()}`;\n\n try {\n // Create or connect to Cloudflare sandbox using getSandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Set environment variables if provided\n if (config.envVars) {\n await sandbox.setEnvVars(config.envVars);\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('unauthorized') || error.message.includes('binding')) {\n throw new Error(\n `Cloudflare Sandbox binding failed. Ensure your Durable Object binding is properly configured in wrangler.toml. ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n if (error.message.includes('quota') || error.message.includes('limit')) {\n throw new Error(\n `Cloudflare resource limits exceeded. Check your usage at https://dash.cloudflare.com/`\n );\n }\n }\n throw new Error(\n `Failed to create Cloudflare sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: CloudflareConfig, sandboxId: string) => {\n if (!config.sandboxBinding) {\n return null;\n }\n\n try {\n // Reconnect to existing Cloudflare sandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Test connection - Note: ping may not be available on all sandbox versions\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n // Sandbox doesn't exist or can't be accessed\n return null;\n }\n },\n\n list: async (_config: CloudflareConfig) => {\n throw new Error(\n `Cloudflare provider does not support listing sandboxes. Cloudflare sandboxes are managed through Durable Objects and don't have a native list API. ` +\n `Use getById to reconnect to specific sandboxes by ID, or implement your own tracking system.`\n );\n },\n\n destroy: async (config: CloudflareConfig, sandboxId: string) => {\n try {\n if (config.sandboxBinding) {\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n \n // Stop all processes and clean up\n await sandbox.killAllProcesses();\n \n // Note: Cloudflare Durable Objects manage their own lifecycle\n // The actual destruction happens automatically when the object is no longer referenced\n }\n } catch (error) {\n // Sandbox might already be destroyed or doesn't exist\n // This is acceptable for destroy operations\n }\n },\n\n // Instance operations (map to individual Sandbox methods)\n runCode: async (cloudflareSandbox: CloudflareSandbox, code: string, runtime?: Runtime): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Auto-detect runtime from code if not specified\n const detectedRuntime = runtime || detectRuntime(code);\n \n let result;\n\n if (detectedRuntime === 'python') {\n // Use Cloudflare's code interpreter for Python\n const execution = await sandbox.runCode(code, { language: 'python' });\n \n // Process the execution result\n let stdout = '';\n let stderr = '';\n \n // Handle streaming results if available\n if (execution.results && Array.isArray(execution.results)) {\n for (const res of execution.results) {\n if (res.text) {\n stdout += res.text;\n }\n }\n }\n \n result = {\n stdout,\n stderr,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } else {\n // For Node.js/JavaScript, use exec with node command\n const execResult = await sandbox.exec(`node -e \"${code.replace(/\"/g, '\\\\\"')}\"`);\n \n result = {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n }\n\n // Check for syntax errors\n if (result.stderr && (\n result.stderr.includes('SyntaxError') ||\n result.stderr.includes('invalid syntax') ||\n result.stderr.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.stderr.trim()}`);\n }\n\n return result;\n } catch (error) {\n // Re-throw syntax errors\n if (error instanceof Error && error.message.includes('Syntax error')) {\n throw error;\n }\n \n throw new Error(\n `Cloudflare execution failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n runCommand: async (cloudflareSandbox: CloudflareSandbox, command: string, args: string[] = []): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Construct full command with arguments\n const fullCommand = args.length > 0 ? `${command} ${args.join(' ')}` : command;\n\n // Execute command using Cloudflare's exec method\n const execResult = await sandbox.exec(fullCommand);\n\n return {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } catch (error) {\n // For command failures, return error info instead of throwing\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 127, // Command not found exit code\n executionTime: Date.now() - startTime,\n sandboxId: cloudflareSandbox.sandboxId,\n provider: 'cloudflare'\n };\n }\n },\n\n getInfo: async (cloudflareSandbox: CloudflareSandbox): Promise<SandboxInfo> => {\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Test if sandbox is still alive - ping may not be available\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n return {\n id: sandboxId,\n provider: 'cloudflare',\n runtime: 'python', // Cloudflare default\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: sandboxId,\n durableObjectSandbox: true\n }\n };\n } catch (error) {\n return {\n id: cloudflareSandbox.sandboxId,\n provider: 'cloudflare',\n runtime: 'python',\n status: 'error',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: cloudflareSandbox.sandboxId,\n durableObjectSandbox: true,\n error: error instanceof Error ? error.message : String(error)\n }\n };\n }\n },\n\n getUrl: async (cloudflareSandbox: CloudflareSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n const { sandbox, exposedPorts } = cloudflareSandbox;\n const { port, protocol = 'https' } = options;\n\n // Check if port is already exposed\n if (exposedPorts.has(port)) {\n return exposedPorts.get(port)!;\n }\n\n // Expose the port using Cloudflare's exposePort method\n const preview = await sandbox.exposePort(port);\n const url = `${protocol}://${preview.url}`;\n \n // Cache the exposed URL\n exposedPorts.set(port, url);\n \n return url;\n } catch (error) {\n throw new Error(\n `Failed to expose port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n // Filesystem methods - Cloudflare has full filesystem support\n filesystem: {\n readFile: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<string> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const file = await sandbox.readFile(path);\n return file.content || '';\n } catch (error) {\n throw new Error(`Failed to read file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n writeFile: async (cloudflareSandbox: CloudflareSandbox, path: string, content: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.writeFile(path, content);\n } catch (error) {\n throw new Error(`Failed to write file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n mkdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.mkdir(path);\n } catch (error) {\n throw new Error(`Failed to create directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n readdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<FileEntry[]> => {\n try {\n const { sandbox } = cloudflareSandbox;\n \n // Use ls command to get directory listing\n const result = await sandbox.exec(`ls -la \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Directory listing failed: ${result.stderr}`);\n }\n\n const lines = result.stdout.split('\\n').filter((line: string) => line.trim() && !line.startsWith('total'));\n\n return lines.map((line: string) => {\n const parts = line.trim().split(/\\s+/);\n const permissions = parts[0] || '';\n const size = parseInt(parts[4]) || 0;\n const dateStr = (parts[5] || '') + ' ' + (parts[6] || '');\n const date = dateStr.trim() ? new Date(dateStr) : new Date();\n const name = parts.slice(8).join(' ') || parts[parts.length - 1] || 'unknown';\n\n return {\n name,\n path: `${path}/${name}`.replace('//', '/'),\n isDirectory: permissions.startsWith('d'),\n size,\n lastModified: isNaN(date.getTime()) ? new Date() : date\n };\n });\n } catch (error) {\n throw new Error(`Failed to read directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n exists: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<boolean> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`test -e \"${path}\"`);\n return result.exitCode === 0;\n } catch (error) {\n return false;\n }\n },\n\n remove: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`rm -rf \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Remove failed: ${result.stderr}`);\n }\n } catch (error) {\n throw new Error(`Failed to remove ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n }\n});"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Cloudflare Provider - Factory-based Implementation\n * \n * Full-featured provider using Cloudflare Sandbox SDK with all required methods.\n * Leverages Cloudflare's edge network and Durable Objects for sandboxed execution.\n */\n\nimport { getSandbox } from '@cloudflare/sandbox';\nimport { createProvider } from 'computesdk';\nimport type { \n ExecutionResult, \n SandboxInfo, \n Runtime,\n CreateSandboxOptions,\n FileEntry\n} from 'computesdk';\n\n/**\n * Cloudflare-specific configuration options\n */\nexport interface CloudflareConfig {\n /** Cloudflare Sandbox binding from Workers environment - the Durable Object binding */\n sandboxBinding?: any;\n /** Default runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Environment variables to pass to sandbox */\n envVars?: Record<string, string>;\n /** Base URL for preview URLs (defaults to worker domain) */\n baseUrl?: string;\n}\n\n/**\n * Cloudflare sandbox wrapper - wraps the Cloudflare Sandbox instance\n */\ninterface CloudflareSandbox {\n sandbox: any; // The actual Cloudflare Sandbox instance from getSandbox()\n sandboxId: string;\n exposedPorts: Map<number, string>; // Track exposed ports and their URLs\n}\n\n/**\n * Detect runtime from code content\n */\nfunction detectRuntime(code: string): Runtime {\n // Strong Python indicators\n if (code.includes('print(') || \n code.includes('import ') ||\n code.includes('def ') ||\n code.includes('sys.') ||\n code.includes('json.') ||\n code.includes('__') ||\n code.includes('f\"') ||\n code.includes(\"f'\") ||\n code.includes('raise ')) {\n return 'python';\n }\n\n // Strong Node.js indicators\n if (code.includes('console.log') || \n code.includes('process.') ||\n code.includes('require(') ||\n code.includes('module.exports') ||\n code.includes('__dirname') ||\n code.includes('__filename')) {\n return 'node';\n }\n\n // Default to Python for Cloudflare (matches their examples)\n return 'python';\n}\n\n/**\n * Create a Cloudflare provider instance using the factory pattern\n */\nexport const cloudflare = createProvider<CloudflareSandbox, CloudflareConfig>({\n name: 'cloudflare',\n methods: {\n sandbox: {\n // Collection operations (map to compute.sandbox.*)\n create: async (config: CloudflareConfig, options?: CreateSandboxOptions) => {\n // Validate Cloudflare Workers environment binding\n if (!config.sandboxBinding) {\n throw new Error(\n `Missing Cloudflare Sandbox binding. Provide 'sandboxBinding' in config with the Durable Object binding from your Cloudflare Workers environment (env.Sandbox). ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n\n const sandboxId = options?.sandboxId || `cf-sandbox-${Date.now()}`;\n\n try {\n // Create or connect to Cloudflare sandbox using getSandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Set environment variables if provided\n if (config.envVars) {\n await sandbox.setEnvVars(config.envVars);\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('unauthorized') || error.message.includes('binding')) {\n throw new Error(\n `Cloudflare Sandbox binding failed. Ensure your Durable Object binding is properly configured in wrangler.toml. ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n if (error.message.includes('quota') || error.message.includes('limit')) {\n throw new Error(\n `Cloudflare resource limits exceeded. Check your usage at https://dash.cloudflare.com/`\n );\n }\n }\n throw new Error(\n `Failed to create Cloudflare sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: CloudflareConfig, sandboxId: string) => {\n if (!config.sandboxBinding) {\n return null;\n }\n\n try {\n // Reconnect to existing Cloudflare sandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Test connection - Note: ping may not be available on all sandbox versions\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n // Sandbox doesn't exist or can't be accessed\n return null;\n }\n },\n\n list: async (_config: CloudflareConfig) => {\n throw new Error(\n `Cloudflare provider does not support listing sandboxes. Cloudflare sandboxes are managed through Durable Objects and don't have a native list API. ` +\n `Use getById to reconnect to specific sandboxes by ID, or implement your own tracking system.`\n );\n },\n\n destroy: async (config: CloudflareConfig, sandboxId: string) => {\n try {\n if (config.sandboxBinding) {\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n \n // Stop all processes and clean up\n await sandbox.killAllProcesses();\n \n // Note: Cloudflare Durable Objects manage their own lifecycle\n // The actual destruction happens automatically when the object is no longer referenced\n }\n } catch (error) {\n // Sandbox might already be destroyed or doesn't exist\n // This is acceptable for destroy operations\n }\n },\n\n // Instance operations (map to individual Sandbox methods)\n runCode: async (cloudflareSandbox: CloudflareSandbox, code: string, runtime?: Runtime): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Auto-detect runtime from code if not specified\n const detectedRuntime = runtime || detectRuntime(code);\n \n let result;\n\n if (detectedRuntime === 'python') {\n // Use Cloudflare's code interpreter for Python\n const execution = await sandbox.runCode(code, { language: 'python' });\n \n // Process the execution result\n let stdout = '';\n let stderr = '';\n \n // Handle streaming results if available\n if (execution.results && Array.isArray(execution.results)) {\n for (const res of execution.results) {\n if (res.text) {\n stdout += res.text;\n }\n }\n }\n \n result = {\n stdout,\n stderr,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } else {\n // For Node.js/JavaScript, use exec with node command\n const execResult = await sandbox.exec(`node -e \"${code.replace(/\"/g, '\\\\\"')}\"`);\n \n result = {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n }\n\n // Check for syntax errors\n if (result.stderr && (\n result.stderr.includes('SyntaxError') ||\n result.stderr.includes('invalid syntax') ||\n result.stderr.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.stderr.trim()}`);\n }\n\n return result;\n } catch (error) {\n // Re-throw syntax errors\n if (error instanceof Error && error.message.includes('Syntax error')) {\n throw error;\n }\n \n throw new Error(\n `Cloudflare execution failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n runCommand: async (cloudflareSandbox: CloudflareSandbox, command: string, args: string[] = []): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n\n // Construct full command with arguments, properly quoting each arg\n const quotedArgs = args.map(arg => {\n // Quote arguments that contain spaces or special characters\n if (arg.includes(' ') || arg.includes('\"') || arg.includes(\"'\") || arg.includes('$') || arg.includes('`')) {\n // Escape any double quotes in the argument and wrap in double quotes\n return `\"${arg.replace(/\"/g, '\\\\\"')}\"`;\n }\n return arg;\n });\n const fullCommand = quotedArgs.length > 0 ? `${command} ${quotedArgs.join(' ')}` : command;\n\n // Execute command using Cloudflare's exec method\n const execResult = await sandbox.exec(fullCommand);\n\n return {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } catch (error) {\n // For command failures, return error info instead of throwing\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 127, // Command not found exit code\n executionTime: Date.now() - startTime,\n sandboxId: cloudflareSandbox.sandboxId,\n provider: 'cloudflare'\n };\n }\n },\n\n getInfo: async (cloudflareSandbox: CloudflareSandbox): Promise<SandboxInfo> => {\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Test if sandbox is still alive - ping may not be available\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n return {\n id: sandboxId,\n provider: 'cloudflare',\n runtime: 'python', // Cloudflare default\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: sandboxId,\n durableObjectSandbox: true\n }\n };\n } catch (error) {\n return {\n id: cloudflareSandbox.sandboxId,\n provider: 'cloudflare',\n runtime: 'python',\n status: 'error',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: cloudflareSandbox.sandboxId,\n durableObjectSandbox: true,\n error: error instanceof Error ? error.message : String(error)\n }\n };\n }\n },\n\n getUrl: async (cloudflareSandbox: CloudflareSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n const { sandbox, exposedPorts } = cloudflareSandbox;\n const { port, protocol = 'https' } = options;\n\n // Check if port is already exposed\n if (exposedPorts.has(port)) {\n return exposedPorts.get(port)!;\n }\n\n // Expose the port using Cloudflare's exposePort method\n const preview = await sandbox.exposePort(port);\n const url = `${protocol}://${preview.url}`;\n \n // Cache the exposed URL\n exposedPorts.set(port, url);\n \n return url;\n } catch (error) {\n throw new Error(\n `Failed to expose port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n // Filesystem methods - Cloudflare has full filesystem support\n filesystem: {\n readFile: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<string> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const file = await sandbox.readFile(path);\n return file.content || '';\n } catch (error) {\n throw new Error(`Failed to read file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n writeFile: async (cloudflareSandbox: CloudflareSandbox, path: string, content: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.writeFile(path, content);\n } catch (error) {\n throw new Error(`Failed to write file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n mkdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.mkdir(path);\n } catch (error) {\n throw new Error(`Failed to create directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n readdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<FileEntry[]> => {\n try {\n const { sandbox } = cloudflareSandbox;\n \n // Use ls command to get directory listing\n const result = await sandbox.exec(`ls -la \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Directory listing failed: ${result.stderr}`);\n }\n\n const lines = result.stdout.split('\\n').filter((line: string) => line.trim() && !line.startsWith('total'));\n\n return lines.map((line: string) => {\n const parts = line.trim().split(/\\s+/);\n const permissions = parts[0] || '';\n const size = parseInt(parts[4]) || 0;\n const dateStr = (parts[5] || '') + ' ' + (parts[6] || '');\n const date = dateStr.trim() ? new Date(dateStr) : new Date();\n const name = parts.slice(8).join(' ') || parts[parts.length - 1] || 'unknown';\n\n return {\n name,\n path: `${path}/${name}`.replace('//', '/'),\n isDirectory: permissions.startsWith('d'),\n size,\n lastModified: isNaN(date.getTime()) ? new Date() : date\n };\n });\n } catch (error) {\n throw new Error(`Failed to read directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n exists: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<boolean> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`test -e \"${path}\"`);\n return result.exitCode === 0;\n } catch (error) {\n return false;\n }\n },\n\n remove: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`rm -rf \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Remove failed: ${result.stderr}`);\n }\n } catch (error) {\n throw new Error(`Failed to remove ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n }\n});"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -146,7 +146,13 @@ var cloudflare = createProvider({
146
146
  const startTime = Date.now();
147
147
  try {
148
148
  const { sandbox, sandboxId } = cloudflareSandbox;
149
- const fullCommand = args.length > 0 ? `${command} ${args.join(" ")}` : command;
149
+ const quotedArgs = args.map((arg) => {
150
+ if (arg.includes(" ") || arg.includes('"') || arg.includes("'") || arg.includes("$") || arg.includes("`")) {
151
+ return `"${arg.replace(/"/g, '\\"')}"`;
152
+ }
153
+ return arg;
154
+ });
155
+ const fullCommand = quotedArgs.length > 0 ? `${command} ${quotedArgs.join(" ")}` : command;
150
156
  const execResult = await sandbox.exec(fullCommand);
151
157
  return {
152
158
  stdout: execResult.stdout || "",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Cloudflare Provider - Factory-based Implementation\n * \n * Full-featured provider using Cloudflare Sandbox SDK with all required methods.\n * Leverages Cloudflare's edge network and Durable Objects for sandboxed execution.\n */\n\nimport { getSandbox } from '@cloudflare/sandbox';\nimport { createProvider } from 'computesdk';\nimport type { \n ExecutionResult, \n SandboxInfo, \n Runtime,\n CreateSandboxOptions,\n FileEntry\n} from 'computesdk';\n\n/**\n * Cloudflare-specific configuration options\n */\nexport interface CloudflareConfig {\n /** Cloudflare Sandbox binding from Workers environment - the Durable Object binding */\n sandboxBinding?: any;\n /** Default runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Environment variables to pass to sandbox */\n envVars?: Record<string, string>;\n /** Base URL for preview URLs (defaults to worker domain) */\n baseUrl?: string;\n}\n\n/**\n * Cloudflare sandbox wrapper - wraps the Cloudflare Sandbox instance\n */\ninterface CloudflareSandbox {\n sandbox: any; // The actual Cloudflare Sandbox instance from getSandbox()\n sandboxId: string;\n exposedPorts: Map<number, string>; // Track exposed ports and their URLs\n}\n\n/**\n * Detect runtime from code content\n */\nfunction detectRuntime(code: string): Runtime {\n // Strong Python indicators\n if (code.includes('print(') || \n code.includes('import ') ||\n code.includes('def ') ||\n code.includes('sys.') ||\n code.includes('json.') ||\n code.includes('__') ||\n code.includes('f\"') ||\n code.includes(\"f'\") ||\n code.includes('raise ')) {\n return 'python';\n }\n\n // Strong Node.js indicators\n if (code.includes('console.log') || \n code.includes('process.') ||\n code.includes('require(') ||\n code.includes('module.exports') ||\n code.includes('__dirname') ||\n code.includes('__filename')) {\n return 'node';\n }\n\n // Default to Python for Cloudflare (matches their examples)\n return 'python';\n}\n\n/**\n * Create a Cloudflare provider instance using the factory pattern\n */\nexport const cloudflare = createProvider<CloudflareSandbox, CloudflareConfig>({\n name: 'cloudflare',\n methods: {\n sandbox: {\n // Collection operations (map to compute.sandbox.*)\n create: async (config: CloudflareConfig, options?: CreateSandboxOptions) => {\n // Validate Cloudflare Workers environment binding\n if (!config.sandboxBinding) {\n throw new Error(\n `Missing Cloudflare Sandbox binding. Provide 'sandboxBinding' in config with the Durable Object binding from your Cloudflare Workers environment (env.Sandbox). ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n\n const sandboxId = options?.sandboxId || `cf-sandbox-${Date.now()}`;\n\n try {\n // Create or connect to Cloudflare sandbox using getSandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Set environment variables if provided\n if (config.envVars) {\n await sandbox.setEnvVars(config.envVars);\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('unauthorized') || error.message.includes('binding')) {\n throw new Error(\n `Cloudflare Sandbox binding failed. Ensure your Durable Object binding is properly configured in wrangler.toml. ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n if (error.message.includes('quota') || error.message.includes('limit')) {\n throw new Error(\n `Cloudflare resource limits exceeded. Check your usage at https://dash.cloudflare.com/`\n );\n }\n }\n throw new Error(\n `Failed to create Cloudflare sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: CloudflareConfig, sandboxId: string) => {\n if (!config.sandboxBinding) {\n return null;\n }\n\n try {\n // Reconnect to existing Cloudflare sandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Test connection - Note: ping may not be available on all sandbox versions\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n // Sandbox doesn't exist or can't be accessed\n return null;\n }\n },\n\n list: async (_config: CloudflareConfig) => {\n throw new Error(\n `Cloudflare provider does not support listing sandboxes. Cloudflare sandboxes are managed through Durable Objects and don't have a native list API. ` +\n `Use getById to reconnect to specific sandboxes by ID, or implement your own tracking system.`\n );\n },\n\n destroy: async (config: CloudflareConfig, sandboxId: string) => {\n try {\n if (config.sandboxBinding) {\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n \n // Stop all processes and clean up\n await sandbox.killAllProcesses();\n \n // Note: Cloudflare Durable Objects manage their own lifecycle\n // The actual destruction happens automatically when the object is no longer referenced\n }\n } catch (error) {\n // Sandbox might already be destroyed or doesn't exist\n // This is acceptable for destroy operations\n }\n },\n\n // Instance operations (map to individual Sandbox methods)\n runCode: async (cloudflareSandbox: CloudflareSandbox, code: string, runtime?: Runtime): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Auto-detect runtime from code if not specified\n const detectedRuntime = runtime || detectRuntime(code);\n \n let result;\n\n if (detectedRuntime === 'python') {\n // Use Cloudflare's code interpreter for Python\n const execution = await sandbox.runCode(code, { language: 'python' });\n \n // Process the execution result\n let stdout = '';\n let stderr = '';\n \n // Handle streaming results if available\n if (execution.results && Array.isArray(execution.results)) {\n for (const res of execution.results) {\n if (res.text) {\n stdout += res.text;\n }\n }\n }\n \n result = {\n stdout,\n stderr,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } else {\n // For Node.js/JavaScript, use exec with node command\n const execResult = await sandbox.exec(`node -e \"${code.replace(/\"/g, '\\\\\"')}\"`);\n \n result = {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n }\n\n // Check for syntax errors\n if (result.stderr && (\n result.stderr.includes('SyntaxError') ||\n result.stderr.includes('invalid syntax') ||\n result.stderr.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.stderr.trim()}`);\n }\n\n return result;\n } catch (error) {\n // Re-throw syntax errors\n if (error instanceof Error && error.message.includes('Syntax error')) {\n throw error;\n }\n \n throw new Error(\n `Cloudflare execution failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n runCommand: async (cloudflareSandbox: CloudflareSandbox, command: string, args: string[] = []): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Construct full command with arguments\n const fullCommand = args.length > 0 ? `${command} ${args.join(' ')}` : command;\n\n // Execute command using Cloudflare's exec method\n const execResult = await sandbox.exec(fullCommand);\n\n return {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } catch (error) {\n // For command failures, return error info instead of throwing\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 127, // Command not found exit code\n executionTime: Date.now() - startTime,\n sandboxId: cloudflareSandbox.sandboxId,\n provider: 'cloudflare'\n };\n }\n },\n\n getInfo: async (cloudflareSandbox: CloudflareSandbox): Promise<SandboxInfo> => {\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Test if sandbox is still alive - ping may not be available\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n return {\n id: sandboxId,\n provider: 'cloudflare',\n runtime: 'python', // Cloudflare default\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: sandboxId,\n durableObjectSandbox: true\n }\n };\n } catch (error) {\n return {\n id: cloudflareSandbox.sandboxId,\n provider: 'cloudflare',\n runtime: 'python',\n status: 'error',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: cloudflareSandbox.sandboxId,\n durableObjectSandbox: true,\n error: error instanceof Error ? error.message : String(error)\n }\n };\n }\n },\n\n getUrl: async (cloudflareSandbox: CloudflareSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n const { sandbox, exposedPorts } = cloudflareSandbox;\n const { port, protocol = 'https' } = options;\n\n // Check if port is already exposed\n if (exposedPorts.has(port)) {\n return exposedPorts.get(port)!;\n }\n\n // Expose the port using Cloudflare's exposePort method\n const preview = await sandbox.exposePort(port);\n const url = `${protocol}://${preview.url}`;\n \n // Cache the exposed URL\n exposedPorts.set(port, url);\n \n return url;\n } catch (error) {\n throw new Error(\n `Failed to expose port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n // Filesystem methods - Cloudflare has full filesystem support\n filesystem: {\n readFile: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<string> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const file = await sandbox.readFile(path);\n return file.content || '';\n } catch (error) {\n throw new Error(`Failed to read file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n writeFile: async (cloudflareSandbox: CloudflareSandbox, path: string, content: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.writeFile(path, content);\n } catch (error) {\n throw new Error(`Failed to write file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n mkdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.mkdir(path);\n } catch (error) {\n throw new Error(`Failed to create directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n readdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<FileEntry[]> => {\n try {\n const { sandbox } = cloudflareSandbox;\n \n // Use ls command to get directory listing\n const result = await sandbox.exec(`ls -la \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Directory listing failed: ${result.stderr}`);\n }\n\n const lines = result.stdout.split('\\n').filter((line: string) => line.trim() && !line.startsWith('total'));\n\n return lines.map((line: string) => {\n const parts = line.trim().split(/\\s+/);\n const permissions = parts[0] || '';\n const size = parseInt(parts[4]) || 0;\n const dateStr = (parts[5] || '') + ' ' + (parts[6] || '');\n const date = dateStr.trim() ? new Date(dateStr) : new Date();\n const name = parts.slice(8).join(' ') || parts[parts.length - 1] || 'unknown';\n\n return {\n name,\n path: `${path}/${name}`.replace('//', '/'),\n isDirectory: permissions.startsWith('d'),\n size,\n lastModified: isNaN(date.getTime()) ? new Date() : date\n };\n });\n } catch (error) {\n throw new Error(`Failed to read directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n exists: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<boolean> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`test -e \"${path}\"`);\n return result.exitCode === 0;\n } catch (error) {\n return false;\n }\n },\n\n remove: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`rm -rf \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Remove failed: ${result.stderr}`);\n }\n } catch (error) {\n throw new Error(`Failed to remove ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n }\n});"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Cloudflare Provider - Factory-based Implementation\n * \n * Full-featured provider using Cloudflare Sandbox SDK with all required methods.\n * Leverages Cloudflare's edge network and Durable Objects for sandboxed execution.\n */\n\nimport { getSandbox } from '@cloudflare/sandbox';\nimport { createProvider } from 'computesdk';\nimport type { \n ExecutionResult, \n SandboxInfo, \n Runtime,\n CreateSandboxOptions,\n FileEntry\n} from 'computesdk';\n\n/**\n * Cloudflare-specific configuration options\n */\nexport interface CloudflareConfig {\n /** Cloudflare Sandbox binding from Workers environment - the Durable Object binding */\n sandboxBinding?: any;\n /** Default runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Environment variables to pass to sandbox */\n envVars?: Record<string, string>;\n /** Base URL for preview URLs (defaults to worker domain) */\n baseUrl?: string;\n}\n\n/**\n * Cloudflare sandbox wrapper - wraps the Cloudflare Sandbox instance\n */\ninterface CloudflareSandbox {\n sandbox: any; // The actual Cloudflare Sandbox instance from getSandbox()\n sandboxId: string;\n exposedPorts: Map<number, string>; // Track exposed ports and their URLs\n}\n\n/**\n * Detect runtime from code content\n */\nfunction detectRuntime(code: string): Runtime {\n // Strong Python indicators\n if (code.includes('print(') || \n code.includes('import ') ||\n code.includes('def ') ||\n code.includes('sys.') ||\n code.includes('json.') ||\n code.includes('__') ||\n code.includes('f\"') ||\n code.includes(\"f'\") ||\n code.includes('raise ')) {\n return 'python';\n }\n\n // Strong Node.js indicators\n if (code.includes('console.log') || \n code.includes('process.') ||\n code.includes('require(') ||\n code.includes('module.exports') ||\n code.includes('__dirname') ||\n code.includes('__filename')) {\n return 'node';\n }\n\n // Default to Python for Cloudflare (matches their examples)\n return 'python';\n}\n\n/**\n * Create a Cloudflare provider instance using the factory pattern\n */\nexport const cloudflare = createProvider<CloudflareSandbox, CloudflareConfig>({\n name: 'cloudflare',\n methods: {\n sandbox: {\n // Collection operations (map to compute.sandbox.*)\n create: async (config: CloudflareConfig, options?: CreateSandboxOptions) => {\n // Validate Cloudflare Workers environment binding\n if (!config.sandboxBinding) {\n throw new Error(\n `Missing Cloudflare Sandbox binding. Provide 'sandboxBinding' in config with the Durable Object binding from your Cloudflare Workers environment (env.Sandbox). ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n\n const sandboxId = options?.sandboxId || `cf-sandbox-${Date.now()}`;\n\n try {\n // Create or connect to Cloudflare sandbox using getSandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Set environment variables if provided\n if (config.envVars) {\n await sandbox.setEnvVars(config.envVars);\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('unauthorized') || error.message.includes('binding')) {\n throw new Error(\n `Cloudflare Sandbox binding failed. Ensure your Durable Object binding is properly configured in wrangler.toml. ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n if (error.message.includes('quota') || error.message.includes('limit')) {\n throw new Error(\n `Cloudflare resource limits exceeded. Check your usage at https://dash.cloudflare.com/`\n );\n }\n }\n throw new Error(\n `Failed to create Cloudflare sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: CloudflareConfig, sandboxId: string) => {\n if (!config.sandboxBinding) {\n return null;\n }\n\n try {\n // Reconnect to existing Cloudflare sandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Test connection - Note: ping may not be available on all sandbox versions\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n // Sandbox doesn't exist or can't be accessed\n return null;\n }\n },\n\n list: async (_config: CloudflareConfig) => {\n throw new Error(\n `Cloudflare provider does not support listing sandboxes. Cloudflare sandboxes are managed through Durable Objects and don't have a native list API. ` +\n `Use getById to reconnect to specific sandboxes by ID, or implement your own tracking system.`\n );\n },\n\n destroy: async (config: CloudflareConfig, sandboxId: string) => {\n try {\n if (config.sandboxBinding) {\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n \n // Stop all processes and clean up\n await sandbox.killAllProcesses();\n \n // Note: Cloudflare Durable Objects manage their own lifecycle\n // The actual destruction happens automatically when the object is no longer referenced\n }\n } catch (error) {\n // Sandbox might already be destroyed or doesn't exist\n // This is acceptable for destroy operations\n }\n },\n\n // Instance operations (map to individual Sandbox methods)\n runCode: async (cloudflareSandbox: CloudflareSandbox, code: string, runtime?: Runtime): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Auto-detect runtime from code if not specified\n const detectedRuntime = runtime || detectRuntime(code);\n \n let result;\n\n if (detectedRuntime === 'python') {\n // Use Cloudflare's code interpreter for Python\n const execution = await sandbox.runCode(code, { language: 'python' });\n \n // Process the execution result\n let stdout = '';\n let stderr = '';\n \n // Handle streaming results if available\n if (execution.results && Array.isArray(execution.results)) {\n for (const res of execution.results) {\n if (res.text) {\n stdout += res.text;\n }\n }\n }\n \n result = {\n stdout,\n stderr,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } else {\n // For Node.js/JavaScript, use exec with node command\n const execResult = await sandbox.exec(`node -e \"${code.replace(/\"/g, '\\\\\"')}\"`);\n \n result = {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n }\n\n // Check for syntax errors\n if (result.stderr && (\n result.stderr.includes('SyntaxError') ||\n result.stderr.includes('invalid syntax') ||\n result.stderr.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.stderr.trim()}`);\n }\n\n return result;\n } catch (error) {\n // Re-throw syntax errors\n if (error instanceof Error && error.message.includes('Syntax error')) {\n throw error;\n }\n \n throw new Error(\n `Cloudflare execution failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n runCommand: async (cloudflareSandbox: CloudflareSandbox, command: string, args: string[] = []): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n\n // Construct full command with arguments, properly quoting each arg\n const quotedArgs = args.map(arg => {\n // Quote arguments that contain spaces or special characters\n if (arg.includes(' ') || arg.includes('\"') || arg.includes(\"'\") || arg.includes('$') || arg.includes('`')) {\n // Escape any double quotes in the argument and wrap in double quotes\n return `\"${arg.replace(/\"/g, '\\\\\"')}\"`;\n }\n return arg;\n });\n const fullCommand = quotedArgs.length > 0 ? `${command} ${quotedArgs.join(' ')}` : command;\n\n // Execute command using Cloudflare's exec method\n const execResult = await sandbox.exec(fullCommand);\n\n return {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } catch (error) {\n // For command failures, return error info instead of throwing\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 127, // Command not found exit code\n executionTime: Date.now() - startTime,\n sandboxId: cloudflareSandbox.sandboxId,\n provider: 'cloudflare'\n };\n }\n },\n\n getInfo: async (cloudflareSandbox: CloudflareSandbox): Promise<SandboxInfo> => {\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Test if sandbox is still alive - ping may not be available\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n return {\n id: sandboxId,\n provider: 'cloudflare',\n runtime: 'python', // Cloudflare default\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: sandboxId,\n durableObjectSandbox: true\n }\n };\n } catch (error) {\n return {\n id: cloudflareSandbox.sandboxId,\n provider: 'cloudflare',\n runtime: 'python',\n status: 'error',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: cloudflareSandbox.sandboxId,\n durableObjectSandbox: true,\n error: error instanceof Error ? error.message : String(error)\n }\n };\n }\n },\n\n getUrl: async (cloudflareSandbox: CloudflareSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n const { sandbox, exposedPorts } = cloudflareSandbox;\n const { port, protocol = 'https' } = options;\n\n // Check if port is already exposed\n if (exposedPorts.has(port)) {\n return exposedPorts.get(port)!;\n }\n\n // Expose the port using Cloudflare's exposePort method\n const preview = await sandbox.exposePort(port);\n const url = `${protocol}://${preview.url}`;\n \n // Cache the exposed URL\n exposedPorts.set(port, url);\n \n return url;\n } catch (error) {\n throw new Error(\n `Failed to expose port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n // Filesystem methods - Cloudflare has full filesystem support\n filesystem: {\n readFile: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<string> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const file = await sandbox.readFile(path);\n return file.content || '';\n } catch (error) {\n throw new Error(`Failed to read file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n writeFile: async (cloudflareSandbox: CloudflareSandbox, path: string, content: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.writeFile(path, content);\n } catch (error) {\n throw new Error(`Failed to write file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n mkdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.mkdir(path);\n } catch (error) {\n throw new Error(`Failed to create directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n readdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<FileEntry[]> => {\n try {\n const { sandbox } = cloudflareSandbox;\n \n // Use ls command to get directory listing\n const result = await sandbox.exec(`ls -la \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Directory listing failed: ${result.stderr}`);\n }\n\n const lines = result.stdout.split('\\n').filter((line: string) => line.trim() && !line.startsWith('total'));\n\n return lines.map((line: string) => {\n const parts = line.trim().split(/\\s+/);\n const permissions = parts[0] || '';\n const size = parseInt(parts[4]) || 0;\n const dateStr = (parts[5] || '') + ' ' + (parts[6] || '');\n const date = dateStr.trim() ? new Date(dateStr) : new Date();\n const name = parts.slice(8).join(' ') || parts[parts.length - 1] || 'unknown';\n\n return {\n name,\n path: `${path}/${name}`.replace('//', '/'),\n isDirectory: permissions.startsWith('d'),\n size,\n lastModified: isNaN(date.getTime()) ? new Date() : date\n };\n });\n } catch (error) {\n throw new Error(`Failed to read directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n exists: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<boolean> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`test -e \"${path}\"`);\n return result.exitCode === 0;\n } catch (error) {\n return false;\n }\n },\n\n remove: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`rm -rf \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Remove failed: ${result.stderr}`);\n }\n } catch (error) {\n throw new Error(`Failed to remove ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n }\n});"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/cloudflare",
3
- "version": "1.2.5",
3
+ "version": "1.2.6",
4
4
  "description": "Cloudflare provider for ComputeSDK",
5
5
  "author": "Garrison",
6
6
  "license": "MIT",
@@ -19,7 +19,7 @@
19
19
  ],
20
20
  "dependencies": {
21
21
  "@cloudflare/sandbox": "^0.3.0",
22
- "computesdk": "1.8.5"
22
+ "computesdk": "1.8.6"
23
23
  },
24
24
  "keywords": [
25
25
  "cloudflare",
@@ -52,7 +52,7 @@
52
52
  "typescript": "^5.0.0",
53
53
  "vitest": "^1.0.0",
54
54
  "wrangler": "^3.0.0",
55
- "@computesdk/test-utils": "1.4.0"
55
+ "@computesdk/test-utils": "1.4.1"
56
56
  },
57
57
  "scripts": {
58
58
  "build": "tsup",