@computesdk/beam 0.1.13 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -35,6 +35,56 @@ function shellEscape(arg) {
35
35
  if (arg === "") return "''";
36
36
  return `'${arg.replace(/'/g, "'\\''")}'`;
37
37
  }
38
+ function stableStringify(value) {
39
+ if (typeof value === "bigint") {
40
+ return `${value.toString()}n`;
41
+ }
42
+ if (value === null || typeof value !== "object") {
43
+ return JSON.stringify(value) ?? String(value);
44
+ }
45
+ if (Array.isArray(value)) {
46
+ return `[${value.map(stableStringify).join(",")}]`;
47
+ }
48
+ const object = value;
49
+ return `{${Object.keys(object).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(object[key])}`).join(",")}}`;
50
+ }
51
+ function hashString(value) {
52
+ let hash = 2166136261;
53
+ for (let i = 0; i < value.length; i++) {
54
+ hash ^= value.charCodeAt(i);
55
+ hash = Math.imul(hash, 16777619);
56
+ }
57
+ return (hash >>> 0).toString(16);
58
+ }
59
+ function sandboxCacheKey(sandboxConfig) {
60
+ return stableStringify({
61
+ ...sandboxConfig,
62
+ image: sandboxConfig.image?.config || sandboxConfig.image,
63
+ __beamAuth: {
64
+ token: import_beam_js.beamOpts.token ? hashString(import_beam_js.beamOpts.token) : "",
65
+ workspaceId: import_beam_js.beamOpts.workspaceId || "",
66
+ gatewayUrl: import_beam_js.beamOpts.gatewayUrl || ""
67
+ }
68
+ });
69
+ }
70
+ var MAX_SANDBOX_CACHE_ENTRIES = 32;
71
+ var sandboxCache = /* @__PURE__ */ new Map();
72
+ function getCachedSandbox(cacheKey, sandboxConfig) {
73
+ const cachedSandbox = sandboxCache.get(cacheKey);
74
+ if (cachedSandbox) {
75
+ sandboxCache.delete(cacheKey);
76
+ sandboxCache.set(cacheKey, cachedSandbox);
77
+ return cachedSandbox;
78
+ }
79
+ const sandbox = new import_beam_js.Sandbox(sandboxConfig);
80
+ sandboxCache.set(cacheKey, sandbox);
81
+ while (sandboxCache.size > MAX_SANDBOX_CACHE_ENTRIES) {
82
+ const oldestKey = sandboxCache.keys().next().value;
83
+ if (oldestKey === void 0) break;
84
+ sandboxCache.delete(oldestKey);
85
+ }
86
+ return sandbox;
87
+ }
38
88
  var beam = (0, import_provider.defineProvider)({
39
89
  name: "beam",
40
90
  methods: {
@@ -51,6 +101,7 @@ var beam = (0, import_provider.defineProvider)({
51
101
  `Missing Beam workspace ID. Provide 'workspaceId' in config or set BEAM_WORKSPACE_ID environment variable.`
52
102
  );
53
103
  }
104
+ let cacheKey;
54
105
  try {
55
106
  const {
56
107
  timeout: optTimeout,
@@ -65,23 +116,27 @@ var beam = (0, import_provider.defineProvider)({
65
116
  ...providerOptions
66
117
  } = options || {};
67
118
  const optRuntime = options?.runtime;
119
+ const runtime = optRuntime || "node";
120
+ const sandboxName = name || "computesdk-sandbox";
68
121
  const sandboxConfig = {
69
- name: name || `computesdk-${Date.now()}`,
122
+ name: sandboxName,
70
123
  keepWarmSeconds: 300,
71
124
  ...providerOptions
72
125
  };
73
126
  const timeout = optTimeout ?? config.timeout;
74
127
  if (timeout) sandboxConfig.keepWarmSeconds = Math.ceil(timeout / 1e3);
75
- if (optRuntime === "node") {
128
+ if (runtime === "node" && !sandboxConfig.image) {
76
129
  sandboxConfig.image = import_beam_js.Image.fromRegistry("node:20-slim");
77
130
  }
78
131
  if (envs) {
79
- sandboxConfig.envVars = Object.entries(envs).map(([name2, value]) => `${name2}=${value}`);
132
+ sandboxConfig.env = envs;
80
133
  }
81
- const sandbox = new import_beam_js.Sandbox(sandboxConfig);
134
+ cacheKey = sandboxCacheKey(sandboxConfig);
135
+ const sandbox = getCachedSandbox(cacheKey, sandboxConfig);
82
136
  const instance = await sandbox.create();
83
137
  return { sandbox: instance, sandboxId: instance.containerId };
84
138
  } catch (error) {
139
+ if (cacheKey) sandboxCache.delete(cacheKey);
85
140
  if (error instanceof Error && (error.message.includes("unauthorized") || error.message.includes("401"))) {
86
141
  throw new Error(
87
142
  `Beam authentication failed. Please check your BEAM_TOKEN environment variable. Get your token from https://app.beam.cloud`
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Beam Provider - Factory-based Implementation\n *\n * Containerized sandbox environments using the Beam platform.\n * Beam provides sandboxes with process management, filesystem access,\n * and port exposure capabilities.\n */\n\nimport { Sandbox, SandboxInstance, beamOpts, Image } from '@beamcloud/beam-js';\nimport { defineProvider, escapeShellArg } from '@computesdk/provider';\nimport type {\n CommandResult,\n SandboxInfo,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\n\ntype RunCommandFn = (sandbox: SandboxInstance, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n\nexport interface BeamConfig {\n token?: string;\n workspaceId?: string;\n gatewayUrl?: string;\n timeout?: number;\n}\n\nfunction configureBeamOpts(config: BeamConfig): void {\n beamOpts.token = config.token || (typeof process !== 'undefined' && process.env?.BEAM_TOKEN) || '';\n beamOpts.workspaceId = config.workspaceId || (typeof process !== 'undefined' && process.env?.BEAM_WORKSPACE_ID) || '';\n if (config.gatewayUrl) beamOpts.gatewayUrl = config.gatewayUrl;\n if (config.timeout) (beamOpts as any).timeout = config.timeout;\n}\n\nfunction shellEscape(arg: string): string {\n if (arg === '') return \"''\";\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction isNodeParserFailure(output: string): boolean {\n const hasSyntaxMarker =\n output.includes('SyntaxError') ||\n output.includes('Unexpected token') ||\n output.includes('Unexpected identifier') ||\n output.includes('Unexpected end of input') ||\n output.includes('Invalid or unexpected token');\n\n const hasCompileContext =\n output.includes('[eval]') ||\n output.includes('makeContextifyScript') ||\n output.includes('compileScript') ||\n output.includes('wrapSafe');\n\n const hasRuntimeSyntaxSignature =\n output.includes('at JSON.parse') ||\n output.includes('JSON.parse (<anonymous>)') ||\n output.includes('in JSON at position');\n\n return hasSyntaxMarker && hasCompileContext && !hasRuntimeSyntaxSignature;\n}\n\nfunction isPythonParserFailure(output: string): boolean {\n const hasSyntaxMarker =\n output.includes('SyntaxError') ||\n output.includes('IndentationError') ||\n output.includes('TabError');\n\n const hasStringFileContext = output.includes('File \"<string>\"');\n const hasRuntimeTraceback = output.includes('Traceback (most recent call last)');\n\n return hasSyntaxMarker && hasStringFileContext && !hasRuntimeTraceback;\n}\n\nfunction isParserFailure(output: string, runtime: string): boolean {\n if (!output.trim()) return false;\n if (runtime === 'node') return isNodeParserFailure(output);\n if (runtime === 'python') return isPythonParserFailure(output);\n return false;\n}\n\nexport const beam = defineProvider<SandboxInstance, BeamConfig>({\n name: 'beam',\n methods: {\n sandbox: {\n create: async (config: BeamConfig, options?: CreateSandboxOptions) => {\n configureBeamOpts(config);\n\n if (!beamOpts.token) {\n throw new Error(\n `Missing Beam token. Provide 'token' in config or set BEAM_TOKEN environment variable. Get your token from https://app.beam.cloud`\n );\n }\n\n if (!beamOpts.workspaceId) {\n throw new Error(\n `Missing Beam workspace ID. Provide 'workspaceId' in config or set BEAM_WORKSPACE_ID environment variable.`\n );\n }\n\n try {\n const {\n timeout: optTimeout,\n envs,\n name,\n metadata: _metadata,\n templateId: _templateId,\n snapshotId: _snapshotId,\n sandboxId: _sandboxId,\n namespace: _namespace,\n directory: _directory,\n ...providerOptions\n } = options || {};\n\n const optRuntime = (options as any)?.runtime as string | undefined;\n\n const sandboxConfig: any = {\n name: name || `computesdk-${Date.now()}`,\n keepWarmSeconds: 300,\n ...providerOptions,\n };\n\n const timeout = optTimeout ?? config.timeout;\n if (timeout) sandboxConfig.keepWarmSeconds = Math.ceil(timeout / 1000);\n\n if (optRuntime === 'node') {\n sandboxConfig.image = Image.fromRegistry('node:20-slim');\n }\n\n if (envs) {\n sandboxConfig.envVars = Object.entries(envs).map(([name, value]) => `${name}=${value}`);\n }\n\n const sandbox = new Sandbox(sandboxConfig);\n const instance = await sandbox.create();\n return { sandbox: instance, sandboxId: instance.containerId };\n } catch (error) {\n if (error instanceof Error && (error.message.includes('unauthorized') || error.message.includes('401'))) {\n throw new Error(\n `Beam authentication failed. Please check your BEAM_TOKEN environment variable. Get your token from https://app.beam.cloud`\n );\n }\n throw new Error(\n `Failed to create Beam sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: BeamConfig, sandboxId: string) => {\n configureBeamOpts(config);\n if (!beamOpts.token) return null;\n try {\n const instance = await Sandbox.connect(sandboxId);\n return { sandbox: instance, sandboxId: instance.containerId };\n } catch { return null; }\n },\n\n list: async (_config: BeamConfig) => [],\n\n destroy: async (config: BeamConfig, sandboxId: string) => {\n configureBeamOpts(config);\n if (!beamOpts.token) return;\n try {\n const instance = await Sandbox.connect(sandboxId);\n await instance.terminate();\n } catch { /* Sandbox might already be destroyed */ }\n },\n\n runCommand: async (sandbox: SandboxInstance, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n let fullCommand = command;\n if (options?.env && Object.keys(options.env).length > 0) {\n const envPrefix = Object.entries(options.env).map(([k, v]) => `${k}=\"${escapeShellArg(String(v))}\"`).join(' ');\n fullCommand = `${envPrefix} ${fullCommand}`;\n }\n if (options?.cwd) fullCommand = `cd \"${escapeShellArg(options.cwd)}\" && ${fullCommand}`;\n if (options?.background) fullCommand = `nohup ${fullCommand} > /dev/null 2>&1 &`;\n\n const proc = await sandbox.exec(['sh', '-c', fullCommand]);\n await proc.wait();\n const [stdoutStr, stderrStr] = await Promise.all([proc.stdout.read(), proc.stderr.read()]);\n return { stdout: stdoutStr || '', stderr: stderrStr || '', exitCode: proc.exitCode || 0, durationMs: Date.now() - startTime };\n } catch (error) {\n return { stdout: '', stderr: error instanceof Error ? error.message : String(error), exitCode: 127, durationMs: Date.now() - startTime };\n }\n },\n\n getInfo: async (sandbox: SandboxInstance): Promise<SandboxInfo> => {\n let runtime = 'python';\n const runtimeHint = sandbox as SandboxInstance & { runtime?: unknown; image?: unknown; imageName?: unknown };\n if (typeof runtimeHint.runtime === 'string') {\n const lower = runtimeHint.runtime.toLowerCase();\n if (lower.includes('node')) runtime = 'node';\n else if (lower.includes('python')) runtime = 'python';\n } else if (typeof runtimeHint.image === 'string') {\n const imageStr = runtimeHint.image.toLowerCase();\n if (imageStr.includes('node')) runtime = 'node';\n else if (imageStr.includes('python')) runtime = 'python';\n } else if (typeof runtimeHint.imageName === 'string') {\n const imageNameStr = runtimeHint.imageName.toLowerCase();\n if (imageNameStr.includes('node')) runtime = 'node';\n else if (imageNameStr.includes('python')) runtime = 'python';\n }\n return {\n id: sandbox.containerId,\n provider: 'beam',\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: { containerId: sandbox.containerId, runtime },\n };\n },\n\n getUrl: async (sandbox: SandboxInstance, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n return await sandbox.exposePort(options.port);\n } catch (error) {\n throw new Error(`Failed to get Beam URL for port ${options.port}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n filesystem: {\n readFile: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<string> => {\n const result = await runCommand(sandbox, `cat ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to read file ${path}: ${result.stderr}`);\n return result.stdout;\n },\n writeFile: async (sandbox: SandboxInstance, path: string, content: string, runCommand: RunCommandFn): Promise<void> => {\n const b64 = Buffer.from(content).toString('base64');\n const result = await runCommand(sandbox, `echo '${b64}' | base64 -d > ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to write file ${path}: ${result.stderr}`);\n },\n mkdir: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<void> => {\n const result = await runCommand(sandbox, `mkdir -p ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n },\n readdir: async (sandbox: SandboxInstance, path: string, _runCommand: RunCommandFn): Promise<FileEntry[]> => {\n const files = await sandbox.fs.listFiles(path);\n return files.map((file: any) => ({\n name: file.name,\n type: file.isDir ? 'directory' as const : 'file' as const,\n size: Number(file.size) || 0,\n modified: file.modTime ? new Date(file.modTime * 1000) : new Date(),\n }));\n },\n exists: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<boolean> => {\n const result = await runCommand(sandbox, `test -f ${shellEscape(path)} || test -d ${shellEscape(path)}`);\n return result.exitCode === 0;\n },\n remove: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<void> => {\n const result = await runCommand(sandbox, `rm -rf ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n },\n },\n\n getInstance: (sandbox: SandboxInstance): SandboxInstance => sandbox,\n },\n },\n});\n\nexport type { SandboxInstance as BeamSandboxInstance } from '@beamcloud/beam-js';\n"],"mappings":"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","names":["name"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Beam Provider - Factory-based Implementation\n *\n * Containerized sandbox environments using the Beam platform.\n * Beam provides sandboxes with process management, filesystem access,\n * and port exposure capabilities.\n */\n\nimport { Sandbox, SandboxInstance, beamOpts, Image } from '@beamcloud/beam-js';\nimport { defineProvider, escapeShellArg } from '@computesdk/provider';\nimport type {\n CommandResult,\n SandboxInfo,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\n\ntype RunCommandFn = (sandbox: SandboxInstance, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n\nexport interface BeamConfig {\n token?: string;\n workspaceId?: string;\n gatewayUrl?: string;\n timeout?: number;\n}\n\nfunction configureBeamOpts(config: BeamConfig): void {\n beamOpts.token = config.token || (typeof process !== 'undefined' && process.env?.BEAM_TOKEN) || '';\n beamOpts.workspaceId = config.workspaceId || (typeof process !== 'undefined' && process.env?.BEAM_WORKSPACE_ID) || '';\n if (config.gatewayUrl) beamOpts.gatewayUrl = config.gatewayUrl;\n if (config.timeout) (beamOpts as any).timeout = config.timeout;\n}\n\nfunction shellEscape(arg: string): string {\n if (arg === '') return \"''\";\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction stableStringify(value: unknown): string {\n if (typeof value === 'bigint') {\n return `${value.toString()}n`;\n }\n\n if (value === null || typeof value !== 'object') {\n return JSON.stringify(value) ?? String(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`;\n }\n\n const object = value as Record<string, unknown>;\n return `{${Object.keys(object).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(object[key])}`).join(',')}}`;\n}\n\nfunction hashString(value: string): string {\n let hash = 2166136261;\n for (let i = 0; i < value.length; i++) {\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0).toString(16);\n}\n\nfunction sandboxCacheKey(sandboxConfig: any): string {\n return stableStringify({\n ...sandboxConfig,\n image: sandboxConfig.image?.config || sandboxConfig.image,\n __beamAuth: {\n token: beamOpts.token ? hashString(beamOpts.token) : '',\n workspaceId: beamOpts.workspaceId || '',\n gatewayUrl: beamOpts.gatewayUrl || '',\n },\n });\n}\n\nconst MAX_SANDBOX_CACHE_ENTRIES = 32;\nconst sandboxCache = new Map<string, Sandbox>();\n\nfunction getCachedSandbox(cacheKey: string, sandboxConfig: any): Sandbox {\n const cachedSandbox = sandboxCache.get(cacheKey);\n if (cachedSandbox) {\n sandboxCache.delete(cacheKey);\n sandboxCache.set(cacheKey, cachedSandbox);\n return cachedSandbox;\n }\n\n const sandbox = new Sandbox(sandboxConfig);\n sandboxCache.set(cacheKey, sandbox);\n\n while (sandboxCache.size > MAX_SANDBOX_CACHE_ENTRIES) {\n const oldestKey = sandboxCache.keys().next().value;\n if (oldestKey === undefined) break;\n sandboxCache.delete(oldestKey);\n }\n\n return sandbox;\n}\n\nexport const beam = defineProvider<SandboxInstance, BeamConfig>({\n name: 'beam',\n methods: {\n sandbox: {\n create: async (config: BeamConfig, options?: CreateSandboxOptions) => {\n configureBeamOpts(config);\n\n if (!beamOpts.token) {\n throw new Error(\n `Missing Beam token. Provide 'token' in config or set BEAM_TOKEN environment variable. Get your token from https://app.beam.cloud`\n );\n }\n\n if (!beamOpts.workspaceId) {\n throw new Error(\n `Missing Beam workspace ID. Provide 'workspaceId' in config or set BEAM_WORKSPACE_ID environment variable.`\n );\n }\n\n let cacheKey: string | undefined;\n\n try {\n const {\n timeout: optTimeout,\n envs,\n name,\n metadata: _metadata,\n templateId: _templateId,\n snapshotId: _snapshotId,\n sandboxId: _sandboxId,\n namespace: _namespace,\n directory: _directory,\n ...providerOptions\n } = options || {};\n\n const optRuntime = (options as any)?.runtime as string | undefined;\n const runtime = optRuntime || 'node';\n const sandboxName = name || 'computesdk-sandbox';\n\n const sandboxConfig: any = {\n name: sandboxName,\n keepWarmSeconds: 300,\n ...providerOptions,\n };\n\n const timeout = optTimeout ?? config.timeout;\n if (timeout) sandboxConfig.keepWarmSeconds = Math.ceil(timeout / 1000);\n\n if (runtime === 'node' && !sandboxConfig.image) {\n sandboxConfig.image = Image.fromRegistry('node:20-slim');\n }\n\n if (envs) {\n sandboxConfig.env = envs;\n }\n\n cacheKey = sandboxCacheKey(sandboxConfig);\n const sandbox = getCachedSandbox(cacheKey, sandboxConfig);\n const instance = await sandbox.create();\n return { sandbox: instance, sandboxId: instance.containerId };\n } catch (error) {\n if (cacheKey) sandboxCache.delete(cacheKey);\n if (error instanceof Error && (error.message.includes('unauthorized') || error.message.includes('401'))) {\n throw new Error(\n `Beam authentication failed. Please check your BEAM_TOKEN environment variable. Get your token from https://app.beam.cloud`\n );\n }\n throw new Error(\n `Failed to create Beam sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: BeamConfig, sandboxId: string) => {\n configureBeamOpts(config);\n if (!beamOpts.token) return null;\n try {\n const instance = await Sandbox.connect(sandboxId);\n return { sandbox: instance, sandboxId: instance.containerId };\n } catch { return null; }\n },\n\n list: async (_config: BeamConfig) => [],\n\n destroy: async (config: BeamConfig, sandboxId: string) => {\n configureBeamOpts(config);\n if (!beamOpts.token) return;\n try {\n const instance = await Sandbox.connect(sandboxId);\n await instance.terminate();\n } catch { /* Sandbox might already be destroyed */ }\n },\n\n runCommand: async (sandbox: SandboxInstance, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n let fullCommand = command;\n if (options?.env && Object.keys(options.env).length > 0) {\n const envPrefix = Object.entries(options.env).map(([k, v]) => `${k}=\"${escapeShellArg(String(v))}\"`).join(' ');\n fullCommand = `${envPrefix} ${fullCommand}`;\n }\n if (options?.cwd) fullCommand = `cd \"${escapeShellArg(options.cwd)}\" && ${fullCommand}`;\n if (options?.background) fullCommand = `nohup ${fullCommand} > /dev/null 2>&1 &`;\n\n const proc = await sandbox.exec(['sh', '-c', fullCommand]);\n await proc.wait();\n const [stdoutStr, stderrStr] = await Promise.all([proc.stdout.read(), proc.stderr.read()]);\n return { stdout: stdoutStr || '', stderr: stderrStr || '', exitCode: proc.exitCode || 0, durationMs: Date.now() - startTime };\n } catch (error) {\n return { stdout: '', stderr: error instanceof Error ? error.message : String(error), exitCode: 127, durationMs: Date.now() - startTime };\n }\n },\n\n getInfo: async (sandbox: SandboxInstance): Promise<SandboxInfo> => {\n let runtime = 'python';\n const runtimeHint = sandbox as SandboxInstance & { runtime?: unknown; image?: unknown; imageName?: unknown };\n if (typeof runtimeHint.runtime === 'string') {\n const lower = runtimeHint.runtime.toLowerCase();\n if (lower.includes('node')) runtime = 'node';\n else if (lower.includes('python')) runtime = 'python';\n } else if (typeof runtimeHint.image === 'string') {\n const imageStr = runtimeHint.image.toLowerCase();\n if (imageStr.includes('node')) runtime = 'node';\n else if (imageStr.includes('python')) runtime = 'python';\n } else if (typeof runtimeHint.imageName === 'string') {\n const imageNameStr = runtimeHint.imageName.toLowerCase();\n if (imageNameStr.includes('node')) runtime = 'node';\n else if (imageNameStr.includes('python')) runtime = 'python';\n }\n return {\n id: sandbox.containerId,\n provider: 'beam',\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: { containerId: sandbox.containerId, runtime },\n };\n },\n\n getUrl: async (sandbox: SandboxInstance, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n return await sandbox.exposePort(options.port);\n } catch (error) {\n throw new Error(`Failed to get Beam URL for port ${options.port}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n filesystem: {\n readFile: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<string> => {\n const result = await runCommand(sandbox, `cat ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to read file ${path}: ${result.stderr}`);\n return result.stdout;\n },\n writeFile: async (sandbox: SandboxInstance, path: string, content: string, runCommand: RunCommandFn): Promise<void> => {\n const b64 = Buffer.from(content).toString('base64');\n const result = await runCommand(sandbox, `echo '${b64}' | base64 -d > ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to write file ${path}: ${result.stderr}`);\n },\n mkdir: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<void> => {\n const result = await runCommand(sandbox, `mkdir -p ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n },\n readdir: async (sandbox: SandboxInstance, path: string, _runCommand: RunCommandFn): Promise<FileEntry[]> => {\n const files = await sandbox.fs.listFiles(path);\n return files.map((file: any) => ({\n name: file.name,\n type: file.isDir ? 'directory' as const : 'file' as const,\n size: Number(file.size) || 0,\n modified: file.modTime ? new Date(file.modTime * 1000) : new Date(),\n }));\n },\n exists: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<boolean> => {\n const result = await runCommand(sandbox, `test -f ${shellEscape(path)} || test -d ${shellEscape(path)}`);\n return result.exitCode === 0;\n },\n remove: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<void> => {\n const result = await runCommand(sandbox, `rm -rf ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n },\n },\n\n getInstance: (sandbox: SandboxInstance): SandboxInstance => sandbox,\n },\n },\n});\n\nexport type { SandboxInstance as BeamSandboxInstance } from '@beamcloud/beam-js';\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -11,6 +11,56 @@ function shellEscape(arg) {
11
11
  if (arg === "") return "''";
12
12
  return `'${arg.replace(/'/g, "'\\''")}'`;
13
13
  }
14
+ function stableStringify(value) {
15
+ if (typeof value === "bigint") {
16
+ return `${value.toString()}n`;
17
+ }
18
+ if (value === null || typeof value !== "object") {
19
+ return JSON.stringify(value) ?? String(value);
20
+ }
21
+ if (Array.isArray(value)) {
22
+ return `[${value.map(stableStringify).join(",")}]`;
23
+ }
24
+ const object = value;
25
+ return `{${Object.keys(object).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(object[key])}`).join(",")}}`;
26
+ }
27
+ function hashString(value) {
28
+ let hash = 2166136261;
29
+ for (let i = 0; i < value.length; i++) {
30
+ hash ^= value.charCodeAt(i);
31
+ hash = Math.imul(hash, 16777619);
32
+ }
33
+ return (hash >>> 0).toString(16);
34
+ }
35
+ function sandboxCacheKey(sandboxConfig) {
36
+ return stableStringify({
37
+ ...sandboxConfig,
38
+ image: sandboxConfig.image?.config || sandboxConfig.image,
39
+ __beamAuth: {
40
+ token: beamOpts.token ? hashString(beamOpts.token) : "",
41
+ workspaceId: beamOpts.workspaceId || "",
42
+ gatewayUrl: beamOpts.gatewayUrl || ""
43
+ }
44
+ });
45
+ }
46
+ var MAX_SANDBOX_CACHE_ENTRIES = 32;
47
+ var sandboxCache = /* @__PURE__ */ new Map();
48
+ function getCachedSandbox(cacheKey, sandboxConfig) {
49
+ const cachedSandbox = sandboxCache.get(cacheKey);
50
+ if (cachedSandbox) {
51
+ sandboxCache.delete(cacheKey);
52
+ sandboxCache.set(cacheKey, cachedSandbox);
53
+ return cachedSandbox;
54
+ }
55
+ const sandbox = new Sandbox(sandboxConfig);
56
+ sandboxCache.set(cacheKey, sandbox);
57
+ while (sandboxCache.size > MAX_SANDBOX_CACHE_ENTRIES) {
58
+ const oldestKey = sandboxCache.keys().next().value;
59
+ if (oldestKey === void 0) break;
60
+ sandboxCache.delete(oldestKey);
61
+ }
62
+ return sandbox;
63
+ }
14
64
  var beam = defineProvider({
15
65
  name: "beam",
16
66
  methods: {
@@ -27,6 +77,7 @@ var beam = defineProvider({
27
77
  `Missing Beam workspace ID. Provide 'workspaceId' in config or set BEAM_WORKSPACE_ID environment variable.`
28
78
  );
29
79
  }
80
+ let cacheKey;
30
81
  try {
31
82
  const {
32
83
  timeout: optTimeout,
@@ -41,23 +92,27 @@ var beam = defineProvider({
41
92
  ...providerOptions
42
93
  } = options || {};
43
94
  const optRuntime = options?.runtime;
95
+ const runtime = optRuntime || "node";
96
+ const sandboxName = name || "computesdk-sandbox";
44
97
  const sandboxConfig = {
45
- name: name || `computesdk-${Date.now()}`,
98
+ name: sandboxName,
46
99
  keepWarmSeconds: 300,
47
100
  ...providerOptions
48
101
  };
49
102
  const timeout = optTimeout ?? config.timeout;
50
103
  if (timeout) sandboxConfig.keepWarmSeconds = Math.ceil(timeout / 1e3);
51
- if (optRuntime === "node") {
104
+ if (runtime === "node" && !sandboxConfig.image) {
52
105
  sandboxConfig.image = Image.fromRegistry("node:20-slim");
53
106
  }
54
107
  if (envs) {
55
- sandboxConfig.envVars = Object.entries(envs).map(([name2, value]) => `${name2}=${value}`);
108
+ sandboxConfig.env = envs;
56
109
  }
57
- const sandbox = new Sandbox(sandboxConfig);
110
+ cacheKey = sandboxCacheKey(sandboxConfig);
111
+ const sandbox = getCachedSandbox(cacheKey, sandboxConfig);
58
112
  const instance = await sandbox.create();
59
113
  return { sandbox: instance, sandboxId: instance.containerId };
60
114
  } catch (error) {
115
+ if (cacheKey) sandboxCache.delete(cacheKey);
61
116
  if (error instanceof Error && (error.message.includes("unauthorized") || error.message.includes("401"))) {
62
117
  throw new Error(
63
118
  `Beam authentication failed. Please check your BEAM_TOKEN environment variable. Get your token from https://app.beam.cloud`
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Beam Provider - Factory-based Implementation\n *\n * Containerized sandbox environments using the Beam platform.\n * Beam provides sandboxes with process management, filesystem access,\n * and port exposure capabilities.\n */\n\nimport { Sandbox, SandboxInstance, beamOpts, Image } from '@beamcloud/beam-js';\nimport { defineProvider, escapeShellArg } from '@computesdk/provider';\nimport type {\n CommandResult,\n SandboxInfo,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\n\ntype RunCommandFn = (sandbox: SandboxInstance, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n\nexport interface BeamConfig {\n token?: string;\n workspaceId?: string;\n gatewayUrl?: string;\n timeout?: number;\n}\n\nfunction configureBeamOpts(config: BeamConfig): void {\n beamOpts.token = config.token || (typeof process !== 'undefined' && process.env?.BEAM_TOKEN) || '';\n beamOpts.workspaceId = config.workspaceId || (typeof process !== 'undefined' && process.env?.BEAM_WORKSPACE_ID) || '';\n if (config.gatewayUrl) beamOpts.gatewayUrl = config.gatewayUrl;\n if (config.timeout) (beamOpts as any).timeout = config.timeout;\n}\n\nfunction shellEscape(arg: string): string {\n if (arg === '') return \"''\";\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction isNodeParserFailure(output: string): boolean {\n const hasSyntaxMarker =\n output.includes('SyntaxError') ||\n output.includes('Unexpected token') ||\n output.includes('Unexpected identifier') ||\n output.includes('Unexpected end of input') ||\n output.includes('Invalid or unexpected token');\n\n const hasCompileContext =\n output.includes('[eval]') ||\n output.includes('makeContextifyScript') ||\n output.includes('compileScript') ||\n output.includes('wrapSafe');\n\n const hasRuntimeSyntaxSignature =\n output.includes('at JSON.parse') ||\n output.includes('JSON.parse (<anonymous>)') ||\n output.includes('in JSON at position');\n\n return hasSyntaxMarker && hasCompileContext && !hasRuntimeSyntaxSignature;\n}\n\nfunction isPythonParserFailure(output: string): boolean {\n const hasSyntaxMarker =\n output.includes('SyntaxError') ||\n output.includes('IndentationError') ||\n output.includes('TabError');\n\n const hasStringFileContext = output.includes('File \"<string>\"');\n const hasRuntimeTraceback = output.includes('Traceback (most recent call last)');\n\n return hasSyntaxMarker && hasStringFileContext && !hasRuntimeTraceback;\n}\n\nfunction isParserFailure(output: string, runtime: string): boolean {\n if (!output.trim()) return false;\n if (runtime === 'node') return isNodeParserFailure(output);\n if (runtime === 'python') return isPythonParserFailure(output);\n return false;\n}\n\nexport const beam = defineProvider<SandboxInstance, BeamConfig>({\n name: 'beam',\n methods: {\n sandbox: {\n create: async (config: BeamConfig, options?: CreateSandboxOptions) => {\n configureBeamOpts(config);\n\n if (!beamOpts.token) {\n throw new Error(\n `Missing Beam token. Provide 'token' in config or set BEAM_TOKEN environment variable. Get your token from https://app.beam.cloud`\n );\n }\n\n if (!beamOpts.workspaceId) {\n throw new Error(\n `Missing Beam workspace ID. Provide 'workspaceId' in config or set BEAM_WORKSPACE_ID environment variable.`\n );\n }\n\n try {\n const {\n timeout: optTimeout,\n envs,\n name,\n metadata: _metadata,\n templateId: _templateId,\n snapshotId: _snapshotId,\n sandboxId: _sandboxId,\n namespace: _namespace,\n directory: _directory,\n ...providerOptions\n } = options || {};\n\n const optRuntime = (options as any)?.runtime as string | undefined;\n\n const sandboxConfig: any = {\n name: name || `computesdk-${Date.now()}`,\n keepWarmSeconds: 300,\n ...providerOptions,\n };\n\n const timeout = optTimeout ?? config.timeout;\n if (timeout) sandboxConfig.keepWarmSeconds = Math.ceil(timeout / 1000);\n\n if (optRuntime === 'node') {\n sandboxConfig.image = Image.fromRegistry('node:20-slim');\n }\n\n if (envs) {\n sandboxConfig.envVars = Object.entries(envs).map(([name, value]) => `${name}=${value}`);\n }\n\n const sandbox = new Sandbox(sandboxConfig);\n const instance = await sandbox.create();\n return { sandbox: instance, sandboxId: instance.containerId };\n } catch (error) {\n if (error instanceof Error && (error.message.includes('unauthorized') || error.message.includes('401'))) {\n throw new Error(\n `Beam authentication failed. Please check your BEAM_TOKEN environment variable. Get your token from https://app.beam.cloud`\n );\n }\n throw new Error(\n `Failed to create Beam sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: BeamConfig, sandboxId: string) => {\n configureBeamOpts(config);\n if (!beamOpts.token) return null;\n try {\n const instance = await Sandbox.connect(sandboxId);\n return { sandbox: instance, sandboxId: instance.containerId };\n } catch { return null; }\n },\n\n list: async (_config: BeamConfig) => [],\n\n destroy: async (config: BeamConfig, sandboxId: string) => {\n configureBeamOpts(config);\n if (!beamOpts.token) return;\n try {\n const instance = await Sandbox.connect(sandboxId);\n await instance.terminate();\n } catch { /* Sandbox might already be destroyed */ }\n },\n\n runCommand: async (sandbox: SandboxInstance, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n let fullCommand = command;\n if (options?.env && Object.keys(options.env).length > 0) {\n const envPrefix = Object.entries(options.env).map(([k, v]) => `${k}=\"${escapeShellArg(String(v))}\"`).join(' ');\n fullCommand = `${envPrefix} ${fullCommand}`;\n }\n if (options?.cwd) fullCommand = `cd \"${escapeShellArg(options.cwd)}\" && ${fullCommand}`;\n if (options?.background) fullCommand = `nohup ${fullCommand} > /dev/null 2>&1 &`;\n\n const proc = await sandbox.exec(['sh', '-c', fullCommand]);\n await proc.wait();\n const [stdoutStr, stderrStr] = await Promise.all([proc.stdout.read(), proc.stderr.read()]);\n return { stdout: stdoutStr || '', stderr: stderrStr || '', exitCode: proc.exitCode || 0, durationMs: Date.now() - startTime };\n } catch (error) {\n return { stdout: '', stderr: error instanceof Error ? error.message : String(error), exitCode: 127, durationMs: Date.now() - startTime };\n }\n },\n\n getInfo: async (sandbox: SandboxInstance): Promise<SandboxInfo> => {\n let runtime = 'python';\n const runtimeHint = sandbox as SandboxInstance & { runtime?: unknown; image?: unknown; imageName?: unknown };\n if (typeof runtimeHint.runtime === 'string') {\n const lower = runtimeHint.runtime.toLowerCase();\n if (lower.includes('node')) runtime = 'node';\n else if (lower.includes('python')) runtime = 'python';\n } else if (typeof runtimeHint.image === 'string') {\n const imageStr = runtimeHint.image.toLowerCase();\n if (imageStr.includes('node')) runtime = 'node';\n else if (imageStr.includes('python')) runtime = 'python';\n } else if (typeof runtimeHint.imageName === 'string') {\n const imageNameStr = runtimeHint.imageName.toLowerCase();\n if (imageNameStr.includes('node')) runtime = 'node';\n else if (imageNameStr.includes('python')) runtime = 'python';\n }\n return {\n id: sandbox.containerId,\n provider: 'beam',\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: { containerId: sandbox.containerId, runtime },\n };\n },\n\n getUrl: async (sandbox: SandboxInstance, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n return await sandbox.exposePort(options.port);\n } catch (error) {\n throw new Error(`Failed to get Beam URL for port ${options.port}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n filesystem: {\n readFile: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<string> => {\n const result = await runCommand(sandbox, `cat ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to read file ${path}: ${result.stderr}`);\n return result.stdout;\n },\n writeFile: async (sandbox: SandboxInstance, path: string, content: string, runCommand: RunCommandFn): Promise<void> => {\n const b64 = Buffer.from(content).toString('base64');\n const result = await runCommand(sandbox, `echo '${b64}' | base64 -d > ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to write file ${path}: ${result.stderr}`);\n },\n mkdir: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<void> => {\n const result = await runCommand(sandbox, `mkdir -p ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n },\n readdir: async (sandbox: SandboxInstance, path: string, _runCommand: RunCommandFn): Promise<FileEntry[]> => {\n const files = await sandbox.fs.listFiles(path);\n return files.map((file: any) => ({\n name: file.name,\n type: file.isDir ? 'directory' as const : 'file' as const,\n size: Number(file.size) || 0,\n modified: file.modTime ? new Date(file.modTime * 1000) : new Date(),\n }));\n },\n exists: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<boolean> => {\n const result = await runCommand(sandbox, `test -f ${shellEscape(path)} || test -d ${shellEscape(path)}`);\n return result.exitCode === 0;\n },\n remove: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<void> => {\n const result = await runCommand(sandbox, `rm -rf ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n },\n },\n\n getInstance: (sandbox: SandboxInstance): SandboxInstance => sandbox,\n },\n },\n});\n\nexport type { SandboxInstance as BeamSandboxInstance } from '@beamcloud/beam-js';\n"],"mappings":"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","names":["name"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Beam Provider - Factory-based Implementation\n *\n * Containerized sandbox environments using the Beam platform.\n * Beam provides sandboxes with process management, filesystem access,\n * and port exposure capabilities.\n */\n\nimport { Sandbox, SandboxInstance, beamOpts, Image } from '@beamcloud/beam-js';\nimport { defineProvider, escapeShellArg } from '@computesdk/provider';\nimport type {\n CommandResult,\n SandboxInfo,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\n\ntype RunCommandFn = (sandbox: SandboxInstance, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n\nexport interface BeamConfig {\n token?: string;\n workspaceId?: string;\n gatewayUrl?: string;\n timeout?: number;\n}\n\nfunction configureBeamOpts(config: BeamConfig): void {\n beamOpts.token = config.token || (typeof process !== 'undefined' && process.env?.BEAM_TOKEN) || '';\n beamOpts.workspaceId = config.workspaceId || (typeof process !== 'undefined' && process.env?.BEAM_WORKSPACE_ID) || '';\n if (config.gatewayUrl) beamOpts.gatewayUrl = config.gatewayUrl;\n if (config.timeout) (beamOpts as any).timeout = config.timeout;\n}\n\nfunction shellEscape(arg: string): string {\n if (arg === '') return \"''\";\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction stableStringify(value: unknown): string {\n if (typeof value === 'bigint') {\n return `${value.toString()}n`;\n }\n\n if (value === null || typeof value !== 'object') {\n return JSON.stringify(value) ?? String(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`;\n }\n\n const object = value as Record<string, unknown>;\n return `{${Object.keys(object).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(object[key])}`).join(',')}}`;\n}\n\nfunction hashString(value: string): string {\n let hash = 2166136261;\n for (let i = 0; i < value.length; i++) {\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0).toString(16);\n}\n\nfunction sandboxCacheKey(sandboxConfig: any): string {\n return stableStringify({\n ...sandboxConfig,\n image: sandboxConfig.image?.config || sandboxConfig.image,\n __beamAuth: {\n token: beamOpts.token ? hashString(beamOpts.token) : '',\n workspaceId: beamOpts.workspaceId || '',\n gatewayUrl: beamOpts.gatewayUrl || '',\n },\n });\n}\n\nconst MAX_SANDBOX_CACHE_ENTRIES = 32;\nconst sandboxCache = new Map<string, Sandbox>();\n\nfunction getCachedSandbox(cacheKey: string, sandboxConfig: any): Sandbox {\n const cachedSandbox = sandboxCache.get(cacheKey);\n if (cachedSandbox) {\n sandboxCache.delete(cacheKey);\n sandboxCache.set(cacheKey, cachedSandbox);\n return cachedSandbox;\n }\n\n const sandbox = new Sandbox(sandboxConfig);\n sandboxCache.set(cacheKey, sandbox);\n\n while (sandboxCache.size > MAX_SANDBOX_CACHE_ENTRIES) {\n const oldestKey = sandboxCache.keys().next().value;\n if (oldestKey === undefined) break;\n sandboxCache.delete(oldestKey);\n }\n\n return sandbox;\n}\n\nexport const beam = defineProvider<SandboxInstance, BeamConfig>({\n name: 'beam',\n methods: {\n sandbox: {\n create: async (config: BeamConfig, options?: CreateSandboxOptions) => {\n configureBeamOpts(config);\n\n if (!beamOpts.token) {\n throw new Error(\n `Missing Beam token. Provide 'token' in config or set BEAM_TOKEN environment variable. Get your token from https://app.beam.cloud`\n );\n }\n\n if (!beamOpts.workspaceId) {\n throw new Error(\n `Missing Beam workspace ID. Provide 'workspaceId' in config or set BEAM_WORKSPACE_ID environment variable.`\n );\n }\n\n let cacheKey: string | undefined;\n\n try {\n const {\n timeout: optTimeout,\n envs,\n name,\n metadata: _metadata,\n templateId: _templateId,\n snapshotId: _snapshotId,\n sandboxId: _sandboxId,\n namespace: _namespace,\n directory: _directory,\n ...providerOptions\n } = options || {};\n\n const optRuntime = (options as any)?.runtime as string | undefined;\n const runtime = optRuntime || 'node';\n const sandboxName = name || 'computesdk-sandbox';\n\n const sandboxConfig: any = {\n name: sandboxName,\n keepWarmSeconds: 300,\n ...providerOptions,\n };\n\n const timeout = optTimeout ?? config.timeout;\n if (timeout) sandboxConfig.keepWarmSeconds = Math.ceil(timeout / 1000);\n\n if (runtime === 'node' && !sandboxConfig.image) {\n sandboxConfig.image = Image.fromRegistry('node:20-slim');\n }\n\n if (envs) {\n sandboxConfig.env = envs;\n }\n\n cacheKey = sandboxCacheKey(sandboxConfig);\n const sandbox = getCachedSandbox(cacheKey, sandboxConfig);\n const instance = await sandbox.create();\n return { sandbox: instance, sandboxId: instance.containerId };\n } catch (error) {\n if (cacheKey) sandboxCache.delete(cacheKey);\n if (error instanceof Error && (error.message.includes('unauthorized') || error.message.includes('401'))) {\n throw new Error(\n `Beam authentication failed. Please check your BEAM_TOKEN environment variable. Get your token from https://app.beam.cloud`\n );\n }\n throw new Error(\n `Failed to create Beam sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: BeamConfig, sandboxId: string) => {\n configureBeamOpts(config);\n if (!beamOpts.token) return null;\n try {\n const instance = await Sandbox.connect(sandboxId);\n return { sandbox: instance, sandboxId: instance.containerId };\n } catch { return null; }\n },\n\n list: async (_config: BeamConfig) => [],\n\n destroy: async (config: BeamConfig, sandboxId: string) => {\n configureBeamOpts(config);\n if (!beamOpts.token) return;\n try {\n const instance = await Sandbox.connect(sandboxId);\n await instance.terminate();\n } catch { /* Sandbox might already be destroyed */ }\n },\n\n runCommand: async (sandbox: SandboxInstance, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n let fullCommand = command;\n if (options?.env && Object.keys(options.env).length > 0) {\n const envPrefix = Object.entries(options.env).map(([k, v]) => `${k}=\"${escapeShellArg(String(v))}\"`).join(' ');\n fullCommand = `${envPrefix} ${fullCommand}`;\n }\n if (options?.cwd) fullCommand = `cd \"${escapeShellArg(options.cwd)}\" && ${fullCommand}`;\n if (options?.background) fullCommand = `nohup ${fullCommand} > /dev/null 2>&1 &`;\n\n const proc = await sandbox.exec(['sh', '-c', fullCommand]);\n await proc.wait();\n const [stdoutStr, stderrStr] = await Promise.all([proc.stdout.read(), proc.stderr.read()]);\n return { stdout: stdoutStr || '', stderr: stderrStr || '', exitCode: proc.exitCode || 0, durationMs: Date.now() - startTime };\n } catch (error) {\n return { stdout: '', stderr: error instanceof Error ? error.message : String(error), exitCode: 127, durationMs: Date.now() - startTime };\n }\n },\n\n getInfo: async (sandbox: SandboxInstance): Promise<SandboxInfo> => {\n let runtime = 'python';\n const runtimeHint = sandbox as SandboxInstance & { runtime?: unknown; image?: unknown; imageName?: unknown };\n if (typeof runtimeHint.runtime === 'string') {\n const lower = runtimeHint.runtime.toLowerCase();\n if (lower.includes('node')) runtime = 'node';\n else if (lower.includes('python')) runtime = 'python';\n } else if (typeof runtimeHint.image === 'string') {\n const imageStr = runtimeHint.image.toLowerCase();\n if (imageStr.includes('node')) runtime = 'node';\n else if (imageStr.includes('python')) runtime = 'python';\n } else if (typeof runtimeHint.imageName === 'string') {\n const imageNameStr = runtimeHint.imageName.toLowerCase();\n if (imageNameStr.includes('node')) runtime = 'node';\n else if (imageNameStr.includes('python')) runtime = 'python';\n }\n return {\n id: sandbox.containerId,\n provider: 'beam',\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: { containerId: sandbox.containerId, runtime },\n };\n },\n\n getUrl: async (sandbox: SandboxInstance, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n return await sandbox.exposePort(options.port);\n } catch (error) {\n throw new Error(`Failed to get Beam URL for port ${options.port}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n filesystem: {\n readFile: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<string> => {\n const result = await runCommand(sandbox, `cat ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to read file ${path}: ${result.stderr}`);\n return result.stdout;\n },\n writeFile: async (sandbox: SandboxInstance, path: string, content: string, runCommand: RunCommandFn): Promise<void> => {\n const b64 = Buffer.from(content).toString('base64');\n const result = await runCommand(sandbox, `echo '${b64}' | base64 -d > ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to write file ${path}: ${result.stderr}`);\n },\n mkdir: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<void> => {\n const result = await runCommand(sandbox, `mkdir -p ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n },\n readdir: async (sandbox: SandboxInstance, path: string, _runCommand: RunCommandFn): Promise<FileEntry[]> => {\n const files = await sandbox.fs.listFiles(path);\n return files.map((file: any) => ({\n name: file.name,\n type: file.isDir ? 'directory' as const : 'file' as const,\n size: Number(file.size) || 0,\n modified: file.modTime ? new Date(file.modTime * 1000) : new Date(),\n }));\n },\n exists: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<boolean> => {\n const result = await runCommand(sandbox, `test -f ${shellEscape(path)} || test -d ${shellEscape(path)}`);\n return result.exitCode === 0;\n },\n remove: async (sandbox: SandboxInstance, path: string, runCommand: RunCommandFn): Promise<void> => {\n const result = await runCommand(sandbox, `rm -rf ${shellEscape(path)}`);\n if (result.exitCode !== 0) throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n },\n },\n\n getInstance: (sandbox: SandboxInstance): SandboxInstance => sandbox,\n },\n },\n});\n\nexport type { SandboxInstance as BeamSandboxInstance } from '@beamcloud/beam-js';\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/beam",
3
- "version": "0.1.13",
3
+ "version": "0.2.0",
4
4
  "description": "Beam provider for ComputeSDK - containerized sandbox environments with process management and filesystem access",
5
5
  "author": "ComputeSDK",
6
6
  "license": "MIT",
@@ -19,8 +19,8 @@
19
19
  ],
20
20
  "dependencies": {
21
21
  "@beamcloud/beam-js": "1.0.0-rc.30",
22
- "computesdk": "4.1.2",
23
- "@computesdk/provider": "2.1.2"
22
+ "computesdk": "4.1.3",
23
+ "@computesdk/provider": "2.1.3"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^20.0.0",