@computesdk/cloudflare 1.3.6 → 1.3.7

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.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import * as computesdk from 'computesdk';
2
- import { Runtime } from 'computesdk';
1
+ import * as _computesdk_provider from '@computesdk/provider';
2
+ import { Runtime } from '@computesdk/provider';
3
3
 
4
4
  /**
5
5
  * Cloudflare-specific configuration options
@@ -27,6 +27,6 @@ interface CloudflareSandbox {
27
27
  /**
28
28
  * Create a Cloudflare provider instance using the factory pattern
29
29
  */
30
- declare const cloudflare: (config: CloudflareConfig & computesdk.BaseProviderConfig) => computesdk.Provider<CloudflareSandbox, any, any>;
30
+ declare const cloudflare: (config: CloudflareConfig & _computesdk_provider.BaseProviderConfig) => _computesdk_provider.Provider<CloudflareSandbox, any, any>;
31
31
 
32
32
  export { type CloudflareConfig, cloudflare };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import * as computesdk from 'computesdk';
2
- import { Runtime } from 'computesdk';
1
+ import * as _computesdk_provider from '@computesdk/provider';
2
+ import { Runtime } from '@computesdk/provider';
3
3
 
4
4
  /**
5
5
  * Cloudflare-specific configuration options
@@ -27,6 +27,6 @@ interface CloudflareSandbox {
27
27
  /**
28
28
  * Create a Cloudflare provider instance using the factory pattern
29
29
  */
30
- declare const cloudflare: (config: CloudflareConfig & computesdk.BaseProviderConfig) => computesdk.Provider<CloudflareSandbox, any, any>;
30
+ declare const cloudflare: (config: CloudflareConfig & _computesdk_provider.BaseProviderConfig) => _computesdk_provider.Provider<CloudflareSandbox, any, any>;
31
31
 
32
32
  export { type CloudflareConfig, cloudflare };
package/dist/index.js CHANGED
@@ -24,7 +24,7 @@ __export(index_exports, {
24
24
  });
25
25
  module.exports = __toCommonJS(index_exports);
26
26
  var import_sandbox = require("@cloudflare/sandbox");
27
- var import_computesdk = require("computesdk");
27
+ var import_provider = require("@computesdk/provider");
28
28
  function detectRuntime(code) {
29
29
  if (code.includes("print(") || code.includes("import ") || code.includes("def ") || code.includes("sys.") || code.includes("json.") || code.includes("__") || code.includes('f"') || code.includes("f'") || code.includes("raise ")) {
30
30
  return "python";
@@ -34,7 +34,7 @@ function detectRuntime(code) {
34
34
  }
35
35
  return "python";
36
36
  }
37
- var cloudflare = (0, import_computesdk.createProvider)({
37
+ var cloudflare = (0, import_provider.defineProvider)({
38
38
  name: "cloudflare",
39
39
  methods: {
40
40
  sandbox: {
@@ -285,10 +285,9 @@ var cloudflare = (0, import_computesdk.createProvider)({
285
285
  const name = parts.slice(8).join(" ") || parts[parts.length - 1] || "unknown";
286
286
  return {
287
287
  name,
288
- path: `${path}/${name}`.replace("//", "/"),
289
- isDirectory: permissions.startsWith("d"),
288
+ type: permissions.startsWith("d") ? "directory" : "file",
290
289
  size,
291
- lastModified: isNaN(date.getTime()) ? /* @__PURE__ */ new Date() : date
290
+ modified: isNaN(date.getTime()) ? /* @__PURE__ */ new Date() : date
292
291
  };
293
292
  });
294
293
  } catch (error) {
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 CodeResult,\n CommandResult,\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<CodeResult> => {\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 output: stdout,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n language: 'python'\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 output: (execResult.stdout || '') + (execResult.stderr || ''),\n exitCode: execResult.exitCode || 0,\n language: 'node'\n };\n }\n\n // Check for syntax errors\n if (result.output && (\n result.output.includes('SyntaxError') ||\n result.output.includes('invalid syntax') ||\n result.output.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.output.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<CommandResult> => {\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 durationMs: Date.now() - startTime\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 durationMs: Date.now() - startTime\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 { defineProvider } from '@computesdk/provider';\n\nimport type { Runtime, CodeResult, CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry } from '@computesdk/provider';\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 = defineProvider<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<CodeResult> => {\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 output: stdout,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n language: 'python'\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 output: (execResult.stdout || '') + (execResult.stderr || ''),\n exitCode: execResult.exitCode || 0,\n language: 'node'\n };\n }\n\n // Check for syntax errors\n if (result.output && (\n result.output.includes('SyntaxError') ||\n result.output.includes('invalid syntax') ||\n result.output.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.output.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<CommandResult> => {\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 durationMs: Date.now() - startTime\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 durationMs: Date.now() - startTime\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 type: permissions.startsWith('d') ? 'directory' as const : 'file' as const,\n size,\n modified: 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});\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/index.ts
2
2
  import { getSandbox } from "@cloudflare/sandbox";
3
- import { createProvider } from "computesdk";
3
+ import { defineProvider } from "@computesdk/provider";
4
4
  function detectRuntime(code) {
5
5
  if (code.includes("print(") || code.includes("import ") || code.includes("def ") || code.includes("sys.") || code.includes("json.") || code.includes("__") || code.includes('f"') || code.includes("f'") || code.includes("raise ")) {
6
6
  return "python";
@@ -10,7 +10,7 @@ function detectRuntime(code) {
10
10
  }
11
11
  return "python";
12
12
  }
13
- var cloudflare = createProvider({
13
+ var cloudflare = defineProvider({
14
14
  name: "cloudflare",
15
15
  methods: {
16
16
  sandbox: {
@@ -261,10 +261,9 @@ var cloudflare = createProvider({
261
261
  const name = parts.slice(8).join(" ") || parts[parts.length - 1] || "unknown";
262
262
  return {
263
263
  name,
264
- path: `${path}/${name}`.replace("//", "/"),
265
- isDirectory: permissions.startsWith("d"),
264
+ type: permissions.startsWith("d") ? "directory" : "file",
266
265
  size,
267
- lastModified: isNaN(date.getTime()) ? /* @__PURE__ */ new Date() : date
266
+ modified: isNaN(date.getTime()) ? /* @__PURE__ */ new Date() : date
268
267
  };
269
268
  });
270
269
  } catch (error) {
@@ -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 CodeResult,\n CommandResult,\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<CodeResult> => {\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 output: stdout,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n language: 'python'\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 output: (execResult.stdout || '') + (execResult.stderr || ''),\n exitCode: execResult.exitCode || 0,\n language: 'node'\n };\n }\n\n // Check for syntax errors\n if (result.output && (\n result.output.includes('SyntaxError') ||\n result.output.includes('invalid syntax') ||\n result.output.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.output.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<CommandResult> => {\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 durationMs: Date.now() - startTime\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 durationMs: Date.now() - startTime\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 { defineProvider } from '@computesdk/provider';\n\nimport type { Runtime, CodeResult, CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry } from '@computesdk/provider';\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 = defineProvider<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<CodeResult> => {\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 output: stdout,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n language: 'python'\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 output: (execResult.stdout || '') + (execResult.stderr || ''),\n exitCode: execResult.exitCode || 0,\n language: 'node'\n };\n }\n\n // Check for syntax errors\n if (result.output && (\n result.output.includes('SyntaxError') ||\n result.output.includes('invalid syntax') ||\n result.output.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.output.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<CommandResult> => {\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 durationMs: Date.now() - startTime\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 durationMs: Date.now() - startTime\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 type: permissions.startsWith('d') ? 'directory' as const : 'file' as const,\n size,\n modified: 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});\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.3.6",
3
+ "version": "1.3.7",
4
4
  "description": "Cloudflare provider for ComputeSDK - edge code execution using Cloudflare Workers and Durable Objects",
5
5
  "author": "Garrison",
6
6
  "license": "MIT",
@@ -19,7 +19,8 @@
19
19
  ],
20
20
  "dependencies": {
21
21
  "@cloudflare/sandbox": "^0.3.0",
22
- "computesdk": "1.10.0"
22
+ "@computesdk/provider": "1.0.1",
23
+ "computesdk": "1.10.1"
23
24
  },
24
25
  "keywords": [
25
26
  "computesdk",