@computesdk/blaxel 1.6.16 → 1.6.18
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 +9 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -121,7 +121,7 @@ var blaxel = (0, import_provider.defineProvider)({
|
|
|
121
121
|
},
|
|
122
122
|
list: async (config) => {
|
|
123
123
|
initializeBlaxel(config);
|
|
124
|
-
const sandboxList = await
|
|
124
|
+
const sandboxList = await listAllSandboxes();
|
|
125
125
|
return sandboxList.map((sandbox) => ({
|
|
126
126
|
sandbox,
|
|
127
127
|
sandboxId: sandbox.metadata?.name || "blaxel-unknown"
|
|
@@ -306,7 +306,7 @@ var blaxel = (0, import_provider.defineProvider)({
|
|
|
306
306
|
},
|
|
307
307
|
list: async (config) => {
|
|
308
308
|
initializeBlaxel(config);
|
|
309
|
-
const sandboxList = await
|
|
309
|
+
const sandboxList = await listAllSandboxes();
|
|
310
310
|
return sandboxList.map((sandbox) => ({
|
|
311
311
|
id: sandbox.metadata?.name || "blaxel-unknown",
|
|
312
312
|
provider: "blaxel",
|
|
@@ -345,6 +345,13 @@ var blaxel = (0, import_provider.defineProvider)({
|
|
|
345
345
|
}
|
|
346
346
|
}
|
|
347
347
|
});
|
|
348
|
+
async function listAllSandboxes() {
|
|
349
|
+
const sandboxes = [];
|
|
350
|
+
for await (const sandbox of await import_core.SandboxInstance.list()) {
|
|
351
|
+
sandboxes.push(sandbox);
|
|
352
|
+
}
|
|
353
|
+
return sandboxes;
|
|
354
|
+
}
|
|
348
355
|
function parseTTLToMilliseconds(ttl) {
|
|
349
356
|
if (!ttl) return 3e5;
|
|
350
357
|
if (typeof ttl === "number") return ttl * 1e3;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Blaxel Provider - Factory-based Implementation\n * \n * Full-featured provider with filesystem support using the factory pattern.\n */\n\nimport { SandboxInstance, initialize } from '@blaxel/core';\nimport { defineProvider, escapeShellArg } from '@computesdk/provider';\n\nimport type { CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions, CreateSnapshotOptions, ListSnapshotsOptions } from '@computesdk/provider';\n\n/**\n * Blaxel-specific configuration options\n */\nexport interface BlaxelConfig {\n\t/** Blaxel workspace ID - if not provided, will fallback to BL_WORKSPACE environment variable */\n\tworkspace?: string;\n\t/** Blaxel API key - if not provided, will fallback to BL_API_KEY environment variable */\n\tapiKey?: string;\n\t/** Default image for sandboxes */\n\timage?: string;\n\t/** Default region for sandbox deployment */\n\tregion?: string;\n\t/** Default memory allocation in MB */\n\tmemory?: number | 4096;\n\t/** Default ports for sandbox */\n\tports?: number[] | [3000];\n}\n\n/**\n * Create a Blaxel provider instance using the factory pattern\n */\nexport const blaxel = defineProvider<SandboxInstance, BlaxelConfig, any, any>({\n\tname: 'blaxel',\n\tmethods: {\n\t\tsandbox: {\n\t\t\t// Collection operations (map to compute.sandbox.*)\n\t\t\tcreate: async (config: BlaxelConfig, options?: CreateSandboxOptions) => {\n\t\t\t\t// Destructure known ComputeSDK fields, collect the rest for passthrough\n\t\t\t\tconst {\n\t\t\t\t\ttimeout: optTimeout,\n\t\t\t\t\tenvs,\n\t\t\t\t\tname: _name,\n\t\t\t\t\tmetadata,\n\t\t\t\t\ttemplateId: _templateId,\n\t\t\t\t\tsnapshotId,\n\t\t\t\t\tsandboxId: optSandboxId,\n\t\t\t\t\tnamespace: _namespace,\n\t\t\t\t\tdirectory: _directory,\n\t\t\t\t\t...providerOptions\n\t\t\t\t} = options || {};\n\n\t\t\t\tconst optRuntime = (options as any)?.runtime as string | undefined;\n\n\t\t\t\t// Determine the image to use\n\t\t\t\tlet image = config.image || 'blaxel/base-image:latest'; // Default to prod-base\n\n\t\t\t\t// Override with runtime-specific image if runtime is specified and no explicit image\n\t\t\t\tif (!config.image && optRuntime) {\n\t\t\t\t\tswitch (optRuntime) {\n\t\t\t\t\t\tcase 'python':\n\t\t\t\t\t\t\timage = 'blaxel/py-app:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'node':\n\t\t\t\t\t\t\timage = 'blaxel/ts-app:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\timage = 'blaxel/base-image:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst memory = config.memory;\n\t\t\t\tconst region = config.region;\n\t\t\t\tconst ttl = optTimeout ? `${Math.ceil(optTimeout / 1000)}s` : undefined;\n\n\t\t\ttry {\n\t\t\t\t// Initialize Blaxel SDK with credentials\n\t\t\t\tinitializeBlaxel(config);\n\n\t\t\t\tlet sandbox: SandboxInstance;\n\n\t\t\t\t// Check if we should resume an existing sandbox or create new\n\t\t\t\tconst existingId = optSandboxId || snapshotId;\n\t\t\t\t\n\t\t\t\tif (existingId) {\n\t\t\t\t\t// Resume existing sandbox or snapshot\n\t\t\t\t\tsandbox = await SandboxInstance.get(existingId);\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\tthrow new Error(`Sandbox ${existingId} not found`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Create new Blaxel sandbox\n\t\t\t\t\tsandbox = await SandboxInstance.createIfNotExists({\n\t\t\t\t\t\timage,\n\t\t\t\t\t\tmemory,\n\t\t\t\t\t\tenvs: Object.entries(envs || {}).map(([name, value]) => ({ name, value: value as string })),\n\t\t\t\t\t\t...(metadata?.labels && { labels: metadata.labels }),\n\t\t\t\t\t\tttl,\n\t\t\t\t\t\tports: config.ports?.map(port => ({ target: port, protocol: 'HTTP' })),\n\t\t\t\t\t\t...(region && { region }),\n\t\t\t\t\t\t...providerOptions, // Spread provider-specific options\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsandbox,\n\t\t\t\t\tsandboxId: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\t\tconst errorDetail = error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: typeof error === 'object' && error !== null\n\t\t\t\t\t\t\t? JSON.stringify(error)\n\t\t\t\t\t\t\t: String(error);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\terrorDetail.includes('unauthorized') ||\n\t\t\t\t\t\terrorDetail.includes('Unauthorized') ||\n\t\t\t\t\t\terrorDetail.includes('Forbidden') ||\n\t\t\t\t\t\terrorDetail.includes('API key')\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Blaxel authentication failed: ${errorDetail}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (errorDetail.includes('quota') || errorDetail.includes('limit')) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Blaxel quota exceeded: ${errorDetail}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to create Blaxel sandbox: ${errorDetail}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tgetById: async (config: BlaxelConfig, sandboxId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tconst sandbox = await SandboxInstance.get(sandboxId);\n\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsandbox,\n\t\t\t\t\t\tsandboxId,\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Sandbox doesn't exist or can't be accessed\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tlist: async (config: BlaxelConfig) => {\n\t\t\t\tinitializeBlaxel(config);\n\t\t\t\tconst sandboxList = await SandboxInstance.list();\n\t\t\t\treturn sandboxList.map(sandbox => ({\n\t\t\t\t\tsandbox,\n\t\t\t\t\tsandboxId: sandbox.metadata?.name || 'blaxel-unknown'\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tdestroy: async (config: BlaxelConfig, sandboxId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tawait SandboxInstance.delete(sandboxId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Sandbox might already be destroyed or doesn't exist\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Instance operations (map to individual Sandbox methods)\n\t\trunCommand: async (sandbox: SandboxInstance, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n\t\t\tconst startTime = Date.now();\n\n\t\t\ttry {\n\t\t\t\t// Build command with options\n\t\t\t\tlet fullCommand = command;\n\t\t\t\t\n\t\t\t\t// Handle environment variables\n\t\t\t\tif (options?.env && Object.keys(options.env).length > 0) {\n\t\t\t\t\tconst envPrefix = Object.entries(options.env)\n\t\t\t\t\t\t.map(([k, v]) => `${k}=\"${escapeShellArg(v)}\"`)\n\t\t\t\t\t\t.join(' ');\n\t\t\t\t\tfullCommand = `${envPrefix} ${fullCommand}`;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Handle working directory\n\t\t\t\tif (options?.cwd) {\n\t\t\t\t\tfullCommand = `cd \"${escapeShellArg(options.cwd)}\" && ${fullCommand}`;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Handle background execution\n\t\t\t\tif (options?.background) {\n\t\t\t\t\tfullCommand = `nohup ${fullCommand} > /dev/null 2>&1 &`;\n\t\t\t\t}\n\n\t\t\t\tconst { stdout, stderr, exitCode } = await executeWithStreaming(sandbox, fullCommand);\n\n\t\t\t\treturn {\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr,\n\t\t\t\t\texitCode,\n\t\t\t\t\tdurationMs: Date.now() - startTime\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tstdout: '',\n\t\t\t\t\tstderr: error instanceof Error ? error.message : String(error),\n\t\t\t\t\texitCode: 127,\n\t\t\t\t\tdurationMs: Date.now() - startTime\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\t\tgetInfo: async (sandbox: SandboxInstance): Promise<SandboxInfo> => {\n\t\t\t\tconst runtime = sandbox.spec?.runtime?.image?.includes('py') ? 'python' : 'node';\n\t\t\t\treturn {\n\t\t\t\t\tid: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\tstatus: convertSandboxStatus(sandbox.status),\n\t\t\t\t\tcreatedAt: sandbox.metadata?.createdAt ? new Date(sandbox.metadata.createdAt) : new Date(),\n\t\t\t\t\ttimeout: parseTTLToMilliseconds(sandbox.spec?.runtime?.ttl),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\truntime,\n\t\t\t\t\t\t...sandbox.metadata?.labels\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tgetUrl: async (sandbox: SandboxInstance, options: {\n\t\t\t\tport: number;\n\t\t\t\tttl?: number;\n\t\t\t\tprefixUrl?: string;\n\t\t\t\theaders?: {\n\t\t\t\t\tresponse?: Record<string, string>;\n\t\t\t\t\trequest?: Record<string, string>;\n\t\t\t\t};\n\t\t\t\tcustomDomain?: string;\n\t\t\t\tauthentication?: {\n\t\t\t\t\tpublic?: boolean;\n\t\t\t\t\ttokenExpiryMinutes?: number;\n\t\t\t\t};\n\t\t\t}): Promise<string> => {\n\t\t\t\ttry {\n\t\t\t\t\t// If public is not set, default to true\n\t\t\t\t\tconst isPublic = options.authentication?.public !== undefined ? options.authentication.public : true;\n\n\t\t\t\t\t// Default CORS headers for broad compatibility\n\t\t\t\t\tconst defaultHeaders = {\n\t\t\t\t\t\t\"Access-Control-Allow-Origin\": \"*\",\n\t\t\t\t\t\t\"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, OPTIONS, PATCH\",\n\t\t\t\t\t\t\"Access-Control-Allow-Headers\": \"Content-Type, Authorization, X-Requested-With, X-Blaxel-Preview-Token, X-Blaxel-Authorization\",\n\t\t\t\t\t\t\"Access-Control-Allow-Credentials\": \"true\",\n\t\t\t\t\t\t\"Access-Control-Expose-Headers\": \"Content-Length, X-Request-Id\",\n\t\t\t\t\t\t\"Access-Control-Max-Age\": \"86400\",\n\t\t\t\t\t\t\"Vary\": \"Origin\"\n\t\t\t\t\t};\n\n\t\t\t\t\t// Use custom headers if provided, otherwise use defaults\n\t\t\t\t\tconst responseHeaders = options.headers?.response || defaultHeaders;\n\n\t\t\t\t\t// Create or get existing preview URL using Blaxel's preview API\n\t\t\t\t\tconst preview = await sandbox.previews.createIfNotExists({\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tname: `preview-port-${options.port}-${isPublic ? 'public' : 'private'}`\n\t\t\t\t\t\t},\n\t\t\t\t\t\tspec: {\n\t\t\t\t\t\t\tport: options.port,\n\t\t\t\t\t\t\tpublic: isPublic,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\trequestHeaders: options.headers?.request || defaultHeaders,\n\t\t\t\t\t\t\tcustomDomain: options.customDomain,\n\t\t\t\t\t\t\tprefixUrl: options.prefixUrl,\n\t\t\t\t\t\t\tttl: options.ttl ? `${Math.ceil(options.ttl / 1000)}s` : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Get the preview URL\n\t\t\t\t\tconst url = preview.spec?.url;\n\t\t\t\t\tif (!url) {\n\t\t\t\t\t\tthrow new Error(`Failed to get preview URL for port ${options.port}`);\n\t\t\t\t\t}\n\n\t\t\t\t\t// For private previews, create an access token and append it to the URL\n\t\t\t\t\tif (!isPublic) {\n\t\t\t\t\t\t// Create token with specified expiry (default 60 minutes)\n\t\t\t\t\t\tconst expiryMinutes = options.authentication?.tokenExpiryMinutes || 60;\n\t\t\t\t\t\tconst expiresAt = new Date(Date.now() + expiryMinutes * 60 * 1000);\n\t\t\t\t\t\tconst token = await preview.tokens.create(expiresAt);\n\n\t\t\t\t\t\t// Return URL with token as query parameter\n\t\t\t\t\t\tconst separator = url.includes('?') ? '&' : '?';\n\t\t\t\t\t\treturn `${url}${separator}bl_preview_token=${token.value}`;\n\t\t\t\t\t}\n\n\t\t\t\t\t// For public previews, just return the URL\n\t\t\t\t\treturn url;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to get Blaxel preview URL for port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Optional filesystem methods - implement using Blaxel's filesystem API\n\t\t\tfilesystem: {\n\t\t\t\treadFile: async (sandbox: SandboxInstance, path: string): Promise<string> => {\n\t\t\t\t\tconst result = await sandbox.fs.read(path);\n\t\t\t\t\treturn result || '';\n\t\t\t\t},\n\n\t\t\t\twriteFile: async (sandbox: SandboxInstance, path: string, content: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.write(path, content);\n\t\t\t\t},\n\n\t\t\t\tmkdir: async (sandbox: SandboxInstance, path: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.mkdir(path);\n\t\t\t\t},\n\n\t\t\t\treaddir: async (sandbox: SandboxInstance, path: string): Promise<FileEntry[]> => {\n\t\t\t\t\tconst result = await sandbox.fs.ls(path);\n\t\t\t\t\tconst files = result.files || [];\n\t\t\t\t\tconst directories = result.subdirectories || [];\n\t\t\t\t\tlet entries = [];\n\t\t\t\t\tfor (const file of files) {\n\t\t\t\t\t\tentries.push({\n\t\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\t\ttype: 'file' as const,\n\t\t\t\t\t\t\tsize: file.size || 0,\n\t\t\t\t\t\t\tmodified: new Date(file.lastModified || Date.now())\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tfor (const directory of directories) {\n\t\t\t\t\t\tentries.push({\n\t\t\t\t\t\t\tname: directory.name,\n\t\t\t\t\t\t\ttype: 'directory' as const,\n\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\tmodified: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn entries;\n\t\t\t\t},\n\n\t\t\t\texists: async (sandbox: SandboxInstance, path: string): Promise<boolean> => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait sandbox.fs.read(path);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait sandbox.fs.ls(path);\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tremove: async (sandbox: SandboxInstance, path: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.rm(path);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Provider-specific typed getInstance method\n\t\t\tgetInstance: (sandbox: SandboxInstance): SandboxInstance => {\n\t\t\t\treturn sandbox;\n\t\t\t},\n\t\t},\n\n\t\tsnapshot: {\n\t\t\tcreate: async (config: BlaxelConfig, sandboxId: string, options?: { name?: string }) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\t\n\t\t\t\t\tconst sandbox = await SandboxInstance.get(sandboxId);\n\t\t\t\t\t\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\tthrow new Error(`Sandbox ${sandboxId} not found`);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: sandboxId,\n\t\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tname: options?.name,\n\t\t\t\t\t\t\timage: sandbox.spec?.runtime?.image\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to create Blaxel snapshot: ${error instanceof Error ? error.message : String(error)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tlist: async (config: BlaxelConfig) => {\n\t\t\t\tinitializeBlaxel(config);\n\t\t\t\tconst sandboxList = await SandboxInstance.list();\n\t\t\t\treturn sandboxList.map(sandbox => ({\n\t\t\t\t\tid: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\tcreatedAt: sandbox.metadata?.createdAt ? new Date(sandbox.metadata.createdAt) : new Date(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\timage: sandbox.spec?.runtime?.image,\n\t\t\t\t\t\tstatus: sandbox.status\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tdelete: async (config: BlaxelConfig, snapshotId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tawait SandboxInstance.delete(snapshotId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Ignore if not found\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Templates in Blaxel are pre-configured images\n\t\ttemplate: {\n\t\t\tcreate: async (_config: BlaxelConfig, _options: { name: string }) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel templates must be created via the Blaxel dashboard or CLI. Use image in sandbox.create() to specify a base image.`\n\t\t\t\t);\n\t\t\t},\n\n\t\t\tlist: async (_config: BlaxelConfig) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel provider does not support listing templates via API. Use the dashboard to manage templates.`\n\t\t\t\t);\n\t\t\t},\n\n\t\t\tdelete: async (_config: BlaxelConfig, _templateId: string) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel templates must be deleted via the Blaxel dashboard or CLI.`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/**\n * Parse TTL value from Blaxel's format to milliseconds\n */\nfunction parseTTLToMilliseconds(ttl: string | number | undefined): number {\n\tif (!ttl) return 300000;\n\tif (typeof ttl === 'number') return ttl * 1000;\n\tconst match = ttl.match(/^(\\d+)([smhd])?$/);\n\tif (!match) return 300000;\n\tconst value = parseInt(match[1], 10);\n\tconst unit = match[2] || 's';\n\tswitch (unit) {\n\t\tcase 's': return value * 1000;\n\t\tcase 'm': return value * 60 * 1000;\n\t\tcase 'h': return value * 60 * 60 * 1000;\n\t\tcase 'd': return value * 24 * 60 * 60 * 1000;\n\t\tdefault: return 300000;\n\t}\n}\n\n/**\n * Initialize the Blaxel SDK with credentials from config or environment variables\n */\nfunction initializeBlaxel(config: BlaxelConfig): void {\n\tconst apiKey = config.apiKey || process.env?.BL_API_KEY!;\n\tconst workspace = config.workspace || process.env?.BL_WORKSPACE!;\n\tinitialize({ apikey: apiKey, workspace: workspace });\n}\n\nfunction convertSandboxStatus(status: string | undefined): 'running' | 'stopped' | 'error' {\n\tswitch (status?.toLowerCase()) {\n\t\tcase 'deployed': return 'running';\n\t\tcase 'deleting': return 'stopped';\n\t\tcase 'failed': return 'error';\n\t\tdefault: return 'running';\n\t}\n}\n\n/**\n * Execute a command in the sandbox and capture stdout/stderr\n */\nasync function executeWithStreaming(\n\tsandbox: SandboxInstance,\n\tcommand: string\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n\tconst processResult = await sandbox.process.exec({\n\t\tcommand,\n\t\twaitForCompletion: true,\n\t});\n\tconst result = processResult as { stdout?: string; stderr?: string; exitCode?: number };\n\treturn {\n\t\tstdout: result.stdout || '',\n\t\tstderr: result.stderr || '',\n\t\texitCode: result.exitCode || 0,\n\t};\n}\n\n// Export the Blaxel SandboxInstance type for explicit typing\nexport type { SandboxInstance as BlaxelSandbox } from '@blaxel/core';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Blaxel Provider - Factory-based Implementation\n * \n * Full-featured provider with filesystem support using the factory pattern.\n */\n\nimport { SandboxInstance, initialize } from '@blaxel/core';\nimport { defineProvider, escapeShellArg } from '@computesdk/provider';\n\nimport type { CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions, CreateSnapshotOptions, ListSnapshotsOptions } from '@computesdk/provider';\n\n/**\n * Blaxel-specific configuration options\n */\nexport interface BlaxelConfig {\n\t/** Blaxel workspace ID - if not provided, will fallback to BL_WORKSPACE environment variable */\n\tworkspace?: string;\n\t/** Blaxel API key - if not provided, will fallback to BL_API_KEY environment variable */\n\tapiKey?: string;\n\t/** Default image for sandboxes */\n\timage?: string;\n\t/** Default region for sandbox deployment */\n\tregion?: string;\n\t/** Default memory allocation in MB */\n\tmemory?: number | 4096;\n\t/** Default ports for sandbox */\n\tports?: number[] | [3000];\n}\n\n/**\n * Create a Blaxel provider instance using the factory pattern\n */\nexport const blaxel = defineProvider<SandboxInstance, BlaxelConfig, any, any>({\n\tname: 'blaxel',\n\tmethods: {\n\t\tsandbox: {\n\t\t\t// Collection operations (map to compute.sandbox.*)\n\t\t\tcreate: async (config: BlaxelConfig, options?: CreateSandboxOptions) => {\n\t\t\t\t// Destructure known ComputeSDK fields, collect the rest for passthrough\n\t\t\t\tconst {\n\t\t\t\t\ttimeout: optTimeout,\n\t\t\t\t\tenvs,\n\t\t\t\t\tname: _name,\n\t\t\t\t\tmetadata,\n\t\t\t\t\ttemplateId: _templateId,\n\t\t\t\t\tsnapshotId,\n\t\t\t\t\tsandboxId: optSandboxId,\n\t\t\t\t\tnamespace: _namespace,\n\t\t\t\t\tdirectory: _directory,\n\t\t\t\t\t...providerOptions\n\t\t\t\t} = options || {};\n\n\t\t\t\tconst optRuntime = (options as any)?.runtime as string | undefined;\n\n\t\t\t\t// Determine the image to use\n\t\t\t\tlet image = config.image || 'blaxel/base-image:latest'; // Default to prod-base\n\n\t\t\t\t// Override with runtime-specific image if runtime is specified and no explicit image\n\t\t\t\tif (!config.image && optRuntime) {\n\t\t\t\t\tswitch (optRuntime) {\n\t\t\t\t\t\tcase 'python':\n\t\t\t\t\t\t\timage = 'blaxel/py-app:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'node':\n\t\t\t\t\t\t\timage = 'blaxel/ts-app:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\timage = 'blaxel/base-image:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst memory = config.memory;\n\t\t\t\tconst region = config.region;\n\t\t\t\tconst ttl = optTimeout ? `${Math.ceil(optTimeout / 1000)}s` : undefined;\n\n\t\t\ttry {\n\t\t\t\t// Initialize Blaxel SDK with credentials\n\t\t\t\tinitializeBlaxel(config);\n\n\t\t\t\tlet sandbox: SandboxInstance;\n\n\t\t\t\t// Check if we should resume an existing sandbox or create new\n\t\t\t\tconst existingId = optSandboxId || snapshotId;\n\t\t\t\t\n\t\t\t\tif (existingId) {\n\t\t\t\t\t// Resume existing sandbox or snapshot\n\t\t\t\t\tsandbox = await SandboxInstance.get(existingId);\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\tthrow new Error(`Sandbox ${existingId} not found`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Create new Blaxel sandbox\n\t\t\t\t\tsandbox = await SandboxInstance.createIfNotExists({\n\t\t\t\t\t\timage,\n\t\t\t\t\t\tmemory,\n\t\t\t\t\t\tenvs: Object.entries(envs || {}).map(([name, value]) => ({ name, value: value as string })),\n\t\t\t\t\t\t...(metadata?.labels && { labels: metadata.labels }),\n\t\t\t\t\t\tttl,\n\t\t\t\t\t\tports: config.ports?.map(port => ({ target: port, protocol: 'HTTP' })),\n\t\t\t\t\t\t...(region && { region }),\n\t\t\t\t\t\t...providerOptions, // Spread provider-specific options\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsandbox,\n\t\t\t\t\tsandboxId: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\t\tconst errorDetail = error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: typeof error === 'object' && error !== null\n\t\t\t\t\t\t\t? JSON.stringify(error)\n\t\t\t\t\t\t\t: String(error);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\terrorDetail.includes('unauthorized') ||\n\t\t\t\t\t\terrorDetail.includes('Unauthorized') ||\n\t\t\t\t\t\terrorDetail.includes('Forbidden') ||\n\t\t\t\t\t\terrorDetail.includes('API key')\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Blaxel authentication failed: ${errorDetail}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (errorDetail.includes('quota') || errorDetail.includes('limit')) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Blaxel quota exceeded: ${errorDetail}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to create Blaxel sandbox: ${errorDetail}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tgetById: async (config: BlaxelConfig, sandboxId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tconst sandbox = await SandboxInstance.get(sandboxId);\n\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsandbox,\n\t\t\t\t\t\tsandboxId,\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Sandbox doesn't exist or can't be accessed\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tlist: async (config: BlaxelConfig) => {\n\t\t\t\tinitializeBlaxel(config);\n\t\t\t\tconst sandboxList = await listAllSandboxes();\n\t\t\t\treturn sandboxList.map(sandbox => ({\n\t\t\t\t\tsandbox,\n\t\t\t\t\tsandboxId: sandbox.metadata?.name || 'blaxel-unknown'\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tdestroy: async (config: BlaxelConfig, sandboxId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tawait SandboxInstance.delete(sandboxId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Sandbox might already be destroyed or doesn't exist\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Instance operations (map to individual Sandbox methods)\n\t\trunCommand: async (sandbox: SandboxInstance, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n\t\t\tconst startTime = Date.now();\n\n\t\t\ttry {\n\t\t\t\t// Build command with options\n\t\t\t\tlet fullCommand = command;\n\t\t\t\t\n\t\t\t\t// Handle environment variables\n\t\t\t\tif (options?.env && Object.keys(options.env).length > 0) {\n\t\t\t\t\tconst envPrefix = Object.entries(options.env)\n\t\t\t\t\t\t.map(([k, v]) => `${k}=\"${escapeShellArg(v)}\"`)\n\t\t\t\t\t\t.join(' ');\n\t\t\t\t\tfullCommand = `${envPrefix} ${fullCommand}`;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Handle working directory\n\t\t\t\tif (options?.cwd) {\n\t\t\t\t\tfullCommand = `cd \"${escapeShellArg(options.cwd)}\" && ${fullCommand}`;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Handle background execution\n\t\t\t\tif (options?.background) {\n\t\t\t\t\tfullCommand = `nohup ${fullCommand} > /dev/null 2>&1 &`;\n\t\t\t\t}\n\n\t\t\t\tconst { stdout, stderr, exitCode } = await executeWithStreaming(sandbox, fullCommand);\n\n\t\t\t\treturn {\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr,\n\t\t\t\t\texitCode,\n\t\t\t\t\tdurationMs: Date.now() - startTime\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tstdout: '',\n\t\t\t\t\tstderr: error instanceof Error ? error.message : String(error),\n\t\t\t\t\texitCode: 127,\n\t\t\t\t\tdurationMs: Date.now() - startTime\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\t\tgetInfo: async (sandbox: SandboxInstance): Promise<SandboxInfo> => {\n\t\t\t\tconst runtime = sandbox.spec?.runtime?.image?.includes('py') ? 'python' : 'node';\n\t\t\t\treturn {\n\t\t\t\t\tid: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\tstatus: convertSandboxStatus(sandbox.status),\n\t\t\t\t\tcreatedAt: sandbox.metadata?.createdAt ? new Date(sandbox.metadata.createdAt) : new Date(),\n\t\t\t\t\ttimeout: parseTTLToMilliseconds(sandbox.spec?.runtime?.ttl),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\truntime,\n\t\t\t\t\t\t...sandbox.metadata?.labels\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tgetUrl: async (sandbox: SandboxInstance, options: {\n\t\t\t\tport: number;\n\t\t\t\tttl?: number;\n\t\t\t\tprefixUrl?: string;\n\t\t\t\theaders?: {\n\t\t\t\t\tresponse?: Record<string, string>;\n\t\t\t\t\trequest?: Record<string, string>;\n\t\t\t\t};\n\t\t\t\tcustomDomain?: string;\n\t\t\t\tauthentication?: {\n\t\t\t\t\tpublic?: boolean;\n\t\t\t\t\ttokenExpiryMinutes?: number;\n\t\t\t\t};\n\t\t\t}): Promise<string> => {\n\t\t\t\ttry {\n\t\t\t\t\t// If public is not set, default to true\n\t\t\t\t\tconst isPublic = options.authentication?.public !== undefined ? options.authentication.public : true;\n\n\t\t\t\t\t// Default CORS headers for broad compatibility\n\t\t\t\t\tconst defaultHeaders = {\n\t\t\t\t\t\t\"Access-Control-Allow-Origin\": \"*\",\n\t\t\t\t\t\t\"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, OPTIONS, PATCH\",\n\t\t\t\t\t\t\"Access-Control-Allow-Headers\": \"Content-Type, Authorization, X-Requested-With, X-Blaxel-Preview-Token, X-Blaxel-Authorization\",\n\t\t\t\t\t\t\"Access-Control-Allow-Credentials\": \"true\",\n\t\t\t\t\t\t\"Access-Control-Expose-Headers\": \"Content-Length, X-Request-Id\",\n\t\t\t\t\t\t\"Access-Control-Max-Age\": \"86400\",\n\t\t\t\t\t\t\"Vary\": \"Origin\"\n\t\t\t\t\t};\n\n\t\t\t\t\t// Use custom headers if provided, otherwise use defaults\n\t\t\t\t\tconst responseHeaders = options.headers?.response || defaultHeaders;\n\n\t\t\t\t\t// Create or get existing preview URL using Blaxel's preview API\n\t\t\t\t\tconst preview = await sandbox.previews.createIfNotExists({\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tname: `preview-port-${options.port}-${isPublic ? 'public' : 'private'}`\n\t\t\t\t\t\t},\n\t\t\t\t\t\tspec: {\n\t\t\t\t\t\t\tport: options.port,\n\t\t\t\t\t\t\tpublic: isPublic,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\trequestHeaders: options.headers?.request || defaultHeaders,\n\t\t\t\t\t\t\tcustomDomain: options.customDomain,\n\t\t\t\t\t\t\tprefixUrl: options.prefixUrl,\n\t\t\t\t\t\t\tttl: options.ttl ? `${Math.ceil(options.ttl / 1000)}s` : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Get the preview URL\n\t\t\t\t\tconst url = preview.spec?.url;\n\t\t\t\t\tif (!url) {\n\t\t\t\t\t\tthrow new Error(`Failed to get preview URL for port ${options.port}`);\n\t\t\t\t\t}\n\n\t\t\t\t\t// For private previews, create an access token and append it to the URL\n\t\t\t\t\tif (!isPublic) {\n\t\t\t\t\t\t// Create token with specified expiry (default 60 minutes)\n\t\t\t\t\t\tconst expiryMinutes = options.authentication?.tokenExpiryMinutes || 60;\n\t\t\t\t\t\tconst expiresAt = new Date(Date.now() + expiryMinutes * 60 * 1000);\n\t\t\t\t\t\tconst token = await preview.tokens.create(expiresAt);\n\n\t\t\t\t\t\t// Return URL with token as query parameter\n\t\t\t\t\t\tconst separator = url.includes('?') ? '&' : '?';\n\t\t\t\t\t\treturn `${url}${separator}bl_preview_token=${token.value}`;\n\t\t\t\t\t}\n\n\t\t\t\t\t// For public previews, just return the URL\n\t\t\t\t\treturn url;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to get Blaxel preview URL for port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Optional filesystem methods - implement using Blaxel's filesystem API\n\t\t\tfilesystem: {\n\t\t\t\treadFile: async (sandbox: SandboxInstance, path: string): Promise<string> => {\n\t\t\t\t\tconst result = await sandbox.fs.read(path);\n\t\t\t\t\treturn result || '';\n\t\t\t\t},\n\n\t\t\t\twriteFile: async (sandbox: SandboxInstance, path: string, content: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.write(path, content);\n\t\t\t\t},\n\n\t\t\t\tmkdir: async (sandbox: SandboxInstance, path: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.mkdir(path);\n\t\t\t\t},\n\n\t\t\t\treaddir: async (sandbox: SandboxInstance, path: string): Promise<FileEntry[]> => {\n\t\t\t\t\tconst result = await sandbox.fs.ls(path);\n\t\t\t\t\tconst files = result.files || [];\n\t\t\t\t\tconst directories = result.subdirectories || [];\n\t\t\t\t\tlet entries = [];\n\t\t\t\t\tfor (const file of files) {\n\t\t\t\t\t\tentries.push({\n\t\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\t\ttype: 'file' as const,\n\t\t\t\t\t\t\tsize: file.size || 0,\n\t\t\t\t\t\t\tmodified: new Date(file.lastModified || Date.now())\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tfor (const directory of directories) {\n\t\t\t\t\t\tentries.push({\n\t\t\t\t\t\t\tname: directory.name,\n\t\t\t\t\t\t\ttype: 'directory' as const,\n\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\tmodified: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn entries;\n\t\t\t\t},\n\n\t\t\t\texists: async (sandbox: SandboxInstance, path: string): Promise<boolean> => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait sandbox.fs.read(path);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait sandbox.fs.ls(path);\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tremove: async (sandbox: SandboxInstance, path: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.rm(path);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Provider-specific typed getInstance method\n\t\t\tgetInstance: (sandbox: SandboxInstance): SandboxInstance => {\n\t\t\t\treturn sandbox;\n\t\t\t},\n\t\t},\n\n\t\tsnapshot: {\n\t\t\tcreate: async (config: BlaxelConfig, sandboxId: string, options?: { name?: string }) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\t\n\t\t\t\t\tconst sandbox = await SandboxInstance.get(sandboxId);\n\t\t\t\t\t\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\tthrow new Error(`Sandbox ${sandboxId} not found`);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: sandboxId,\n\t\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tname: options?.name,\n\t\t\t\t\t\t\timage: sandbox.spec?.runtime?.image\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to create Blaxel snapshot: ${error instanceof Error ? error.message : String(error)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tlist: async (config: BlaxelConfig) => {\n\t\t\t\tinitializeBlaxel(config);\n\t\t\t\tconst sandboxList = await listAllSandboxes();\n\t\t\t\treturn sandboxList.map(sandbox => ({\n\t\t\t\t\tid: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\tcreatedAt: sandbox.metadata?.createdAt ? new Date(sandbox.metadata.createdAt) : new Date(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\timage: sandbox.spec?.runtime?.image,\n\t\t\t\t\t\tstatus: sandbox.status\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tdelete: async (config: BlaxelConfig, snapshotId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tawait SandboxInstance.delete(snapshotId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Ignore if not found\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Templates in Blaxel are pre-configured images\n\t\ttemplate: {\n\t\t\tcreate: async (_config: BlaxelConfig, _options: { name: string }) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel templates must be created via the Blaxel dashboard or CLI. Use image in sandbox.create() to specify a base image.`\n\t\t\t\t);\n\t\t\t},\n\n\t\t\tlist: async (_config: BlaxelConfig) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel provider does not support listing templates via API. Use the dashboard to manage templates.`\n\t\t\t\t);\n\t\t\t},\n\n\t\t\tdelete: async (_config: BlaxelConfig, _templateId: string) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel templates must be deleted via the Blaxel dashboard or CLI.`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/**\n * Collect all sandboxes across pages — since @blaxel/core 0.3.x, list()\n * returns a cursor-paginated, auto-paging async iterable instead of an array.\n */\nasync function listAllSandboxes(): Promise<SandboxInstance[]> {\n\tconst sandboxes: SandboxInstance[] = [];\n\tfor await (const sandbox of await SandboxInstance.list()) {\n\t\tsandboxes.push(sandbox);\n\t}\n\treturn sandboxes;\n}\n\n/**\n * Parse TTL value from Blaxel's format to milliseconds\n */\nfunction parseTTLToMilliseconds(ttl: string | number | undefined): number {\n\tif (!ttl) return 300000;\n\tif (typeof ttl === 'number') return ttl * 1000;\n\tconst match = ttl.match(/^(\\d+)([smhd])?$/);\n\tif (!match) return 300000;\n\tconst value = parseInt(match[1], 10);\n\tconst unit = match[2] || 's';\n\tswitch (unit) {\n\t\tcase 's': return value * 1000;\n\t\tcase 'm': return value * 60 * 1000;\n\t\tcase 'h': return value * 60 * 60 * 1000;\n\t\tcase 'd': return value * 24 * 60 * 60 * 1000;\n\t\tdefault: return 300000;\n\t}\n}\n\n/**\n * Initialize the Blaxel SDK with credentials from config or environment variables\n */\nfunction initializeBlaxel(config: BlaxelConfig): void {\n\tconst apiKey = config.apiKey || process.env?.BL_API_KEY!;\n\tconst workspace = config.workspace || process.env?.BL_WORKSPACE!;\n\tinitialize({ apikey: apiKey, workspace: workspace });\n}\n\nfunction convertSandboxStatus(status: string | undefined): 'running' | 'stopped' | 'error' {\n\tswitch (status?.toLowerCase()) {\n\t\tcase 'deployed': return 'running';\n\t\tcase 'deleting': return 'stopped';\n\t\tcase 'failed': return 'error';\n\t\tdefault: return 'running';\n\t}\n}\n\n/**\n * Execute a command in the sandbox and capture stdout/stderr\n */\nasync function executeWithStreaming(\n\tsandbox: SandboxInstance,\n\tcommand: string\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n\tconst processResult = await sandbox.process.exec({\n\t\tcommand,\n\t\twaitForCompletion: true,\n\t});\n\tconst result = processResult as { stdout?: string; stderr?: string; exitCode?: number };\n\treturn {\n\t\tstdout: result.stdout || '',\n\t\tstderr: result.stderr || '',\n\t\texitCode: result.exitCode || 0,\n\t};\n}\n\n// Export the Blaxel SandboxInstance type for explicit typing\nexport type { SandboxInstance as BlaxelSandbox } from '@blaxel/core';\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -97,7 +97,7 @@ var blaxel = defineProvider({
|
|
|
97
97
|
},
|
|
98
98
|
list: async (config) => {
|
|
99
99
|
initializeBlaxel(config);
|
|
100
|
-
const sandboxList = await
|
|
100
|
+
const sandboxList = await listAllSandboxes();
|
|
101
101
|
return sandboxList.map((sandbox) => ({
|
|
102
102
|
sandbox,
|
|
103
103
|
sandboxId: sandbox.metadata?.name || "blaxel-unknown"
|
|
@@ -282,7 +282,7 @@ var blaxel = defineProvider({
|
|
|
282
282
|
},
|
|
283
283
|
list: async (config) => {
|
|
284
284
|
initializeBlaxel(config);
|
|
285
|
-
const sandboxList = await
|
|
285
|
+
const sandboxList = await listAllSandboxes();
|
|
286
286
|
return sandboxList.map((sandbox) => ({
|
|
287
287
|
id: sandbox.metadata?.name || "blaxel-unknown",
|
|
288
288
|
provider: "blaxel",
|
|
@@ -321,6 +321,13 @@ var blaxel = defineProvider({
|
|
|
321
321
|
}
|
|
322
322
|
}
|
|
323
323
|
});
|
|
324
|
+
async function listAllSandboxes() {
|
|
325
|
+
const sandboxes = [];
|
|
326
|
+
for await (const sandbox of await SandboxInstance.list()) {
|
|
327
|
+
sandboxes.push(sandbox);
|
|
328
|
+
}
|
|
329
|
+
return sandboxes;
|
|
330
|
+
}
|
|
324
331
|
function parseTTLToMilliseconds(ttl) {
|
|
325
332
|
if (!ttl) return 3e5;
|
|
326
333
|
if (typeof ttl === "number") return ttl * 1e3;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Blaxel Provider - Factory-based Implementation\n * \n * Full-featured provider with filesystem support using the factory pattern.\n */\n\nimport { SandboxInstance, initialize } from '@blaxel/core';\nimport { defineProvider, escapeShellArg } from '@computesdk/provider';\n\nimport type { CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions, CreateSnapshotOptions, ListSnapshotsOptions } from '@computesdk/provider';\n\n/**\n * Blaxel-specific configuration options\n */\nexport interface BlaxelConfig {\n\t/** Blaxel workspace ID - if not provided, will fallback to BL_WORKSPACE environment variable */\n\tworkspace?: string;\n\t/** Blaxel API key - if not provided, will fallback to BL_API_KEY environment variable */\n\tapiKey?: string;\n\t/** Default image for sandboxes */\n\timage?: string;\n\t/** Default region for sandbox deployment */\n\tregion?: string;\n\t/** Default memory allocation in MB */\n\tmemory?: number | 4096;\n\t/** Default ports for sandbox */\n\tports?: number[] | [3000];\n}\n\n/**\n * Create a Blaxel provider instance using the factory pattern\n */\nexport const blaxel = defineProvider<SandboxInstance, BlaxelConfig, any, any>({\n\tname: 'blaxel',\n\tmethods: {\n\t\tsandbox: {\n\t\t\t// Collection operations (map to compute.sandbox.*)\n\t\t\tcreate: async (config: BlaxelConfig, options?: CreateSandboxOptions) => {\n\t\t\t\t// Destructure known ComputeSDK fields, collect the rest for passthrough\n\t\t\t\tconst {\n\t\t\t\t\ttimeout: optTimeout,\n\t\t\t\t\tenvs,\n\t\t\t\t\tname: _name,\n\t\t\t\t\tmetadata,\n\t\t\t\t\ttemplateId: _templateId,\n\t\t\t\t\tsnapshotId,\n\t\t\t\t\tsandboxId: optSandboxId,\n\t\t\t\t\tnamespace: _namespace,\n\t\t\t\t\tdirectory: _directory,\n\t\t\t\t\t...providerOptions\n\t\t\t\t} = options || {};\n\n\t\t\t\tconst optRuntime = (options as any)?.runtime as string | undefined;\n\n\t\t\t\t// Determine the image to use\n\t\t\t\tlet image = config.image || 'blaxel/base-image:latest'; // Default to prod-base\n\n\t\t\t\t// Override with runtime-specific image if runtime is specified and no explicit image\n\t\t\t\tif (!config.image && optRuntime) {\n\t\t\t\t\tswitch (optRuntime) {\n\t\t\t\t\t\tcase 'python':\n\t\t\t\t\t\t\timage = 'blaxel/py-app:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'node':\n\t\t\t\t\t\t\timage = 'blaxel/ts-app:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\timage = 'blaxel/base-image:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst memory = config.memory;\n\t\t\t\tconst region = config.region;\n\t\t\t\tconst ttl = optTimeout ? `${Math.ceil(optTimeout / 1000)}s` : undefined;\n\n\t\t\ttry {\n\t\t\t\t// Initialize Blaxel SDK with credentials\n\t\t\t\tinitializeBlaxel(config);\n\n\t\t\t\tlet sandbox: SandboxInstance;\n\n\t\t\t\t// Check if we should resume an existing sandbox or create new\n\t\t\t\tconst existingId = optSandboxId || snapshotId;\n\t\t\t\t\n\t\t\t\tif (existingId) {\n\t\t\t\t\t// Resume existing sandbox or snapshot\n\t\t\t\t\tsandbox = await SandboxInstance.get(existingId);\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\tthrow new Error(`Sandbox ${existingId} not found`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Create new Blaxel sandbox\n\t\t\t\t\tsandbox = await SandboxInstance.createIfNotExists({\n\t\t\t\t\t\timage,\n\t\t\t\t\t\tmemory,\n\t\t\t\t\t\tenvs: Object.entries(envs || {}).map(([name, value]) => ({ name, value: value as string })),\n\t\t\t\t\t\t...(metadata?.labels && { labels: metadata.labels }),\n\t\t\t\t\t\tttl,\n\t\t\t\t\t\tports: config.ports?.map(port => ({ target: port, protocol: 'HTTP' })),\n\t\t\t\t\t\t...(region && { region }),\n\t\t\t\t\t\t...providerOptions, // Spread provider-specific options\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsandbox,\n\t\t\t\t\tsandboxId: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\t\tconst errorDetail = error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: typeof error === 'object' && error !== null\n\t\t\t\t\t\t\t? JSON.stringify(error)\n\t\t\t\t\t\t\t: String(error);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\terrorDetail.includes('unauthorized') ||\n\t\t\t\t\t\terrorDetail.includes('Unauthorized') ||\n\t\t\t\t\t\terrorDetail.includes('Forbidden') ||\n\t\t\t\t\t\terrorDetail.includes('API key')\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Blaxel authentication failed: ${errorDetail}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (errorDetail.includes('quota') || errorDetail.includes('limit')) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Blaxel quota exceeded: ${errorDetail}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to create Blaxel sandbox: ${errorDetail}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tgetById: async (config: BlaxelConfig, sandboxId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tconst sandbox = await SandboxInstance.get(sandboxId);\n\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsandbox,\n\t\t\t\t\t\tsandboxId,\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Sandbox doesn't exist or can't be accessed\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tlist: async (config: BlaxelConfig) => {\n\t\t\t\tinitializeBlaxel(config);\n\t\t\t\tconst sandboxList = await SandboxInstance.list();\n\t\t\t\treturn sandboxList.map(sandbox => ({\n\t\t\t\t\tsandbox,\n\t\t\t\t\tsandboxId: sandbox.metadata?.name || 'blaxel-unknown'\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tdestroy: async (config: BlaxelConfig, sandboxId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tawait SandboxInstance.delete(sandboxId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Sandbox might already be destroyed or doesn't exist\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Instance operations (map to individual Sandbox methods)\n\t\trunCommand: async (sandbox: SandboxInstance, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n\t\t\tconst startTime = Date.now();\n\n\t\t\ttry {\n\t\t\t\t// Build command with options\n\t\t\t\tlet fullCommand = command;\n\t\t\t\t\n\t\t\t\t// Handle environment variables\n\t\t\t\tif (options?.env && Object.keys(options.env).length > 0) {\n\t\t\t\t\tconst envPrefix = Object.entries(options.env)\n\t\t\t\t\t\t.map(([k, v]) => `${k}=\"${escapeShellArg(v)}\"`)\n\t\t\t\t\t\t.join(' ');\n\t\t\t\t\tfullCommand = `${envPrefix} ${fullCommand}`;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Handle working directory\n\t\t\t\tif (options?.cwd) {\n\t\t\t\t\tfullCommand = `cd \"${escapeShellArg(options.cwd)}\" && ${fullCommand}`;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Handle background execution\n\t\t\t\tif (options?.background) {\n\t\t\t\t\tfullCommand = `nohup ${fullCommand} > /dev/null 2>&1 &`;\n\t\t\t\t}\n\n\t\t\t\tconst { stdout, stderr, exitCode } = await executeWithStreaming(sandbox, fullCommand);\n\n\t\t\t\treturn {\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr,\n\t\t\t\t\texitCode,\n\t\t\t\t\tdurationMs: Date.now() - startTime\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tstdout: '',\n\t\t\t\t\tstderr: error instanceof Error ? error.message : String(error),\n\t\t\t\t\texitCode: 127,\n\t\t\t\t\tdurationMs: Date.now() - startTime\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\t\tgetInfo: async (sandbox: SandboxInstance): Promise<SandboxInfo> => {\n\t\t\t\tconst runtime = sandbox.spec?.runtime?.image?.includes('py') ? 'python' : 'node';\n\t\t\t\treturn {\n\t\t\t\t\tid: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\tstatus: convertSandboxStatus(sandbox.status),\n\t\t\t\t\tcreatedAt: sandbox.metadata?.createdAt ? new Date(sandbox.metadata.createdAt) : new Date(),\n\t\t\t\t\ttimeout: parseTTLToMilliseconds(sandbox.spec?.runtime?.ttl),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\truntime,\n\t\t\t\t\t\t...sandbox.metadata?.labels\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tgetUrl: async (sandbox: SandboxInstance, options: {\n\t\t\t\tport: number;\n\t\t\t\tttl?: number;\n\t\t\t\tprefixUrl?: string;\n\t\t\t\theaders?: {\n\t\t\t\t\tresponse?: Record<string, string>;\n\t\t\t\t\trequest?: Record<string, string>;\n\t\t\t\t};\n\t\t\t\tcustomDomain?: string;\n\t\t\t\tauthentication?: {\n\t\t\t\t\tpublic?: boolean;\n\t\t\t\t\ttokenExpiryMinutes?: number;\n\t\t\t\t};\n\t\t\t}): Promise<string> => {\n\t\t\t\ttry {\n\t\t\t\t\t// If public is not set, default to true\n\t\t\t\t\tconst isPublic = options.authentication?.public !== undefined ? options.authentication.public : true;\n\n\t\t\t\t\t// Default CORS headers for broad compatibility\n\t\t\t\t\tconst defaultHeaders = {\n\t\t\t\t\t\t\"Access-Control-Allow-Origin\": \"*\",\n\t\t\t\t\t\t\"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, OPTIONS, PATCH\",\n\t\t\t\t\t\t\"Access-Control-Allow-Headers\": \"Content-Type, Authorization, X-Requested-With, X-Blaxel-Preview-Token, X-Blaxel-Authorization\",\n\t\t\t\t\t\t\"Access-Control-Allow-Credentials\": \"true\",\n\t\t\t\t\t\t\"Access-Control-Expose-Headers\": \"Content-Length, X-Request-Id\",\n\t\t\t\t\t\t\"Access-Control-Max-Age\": \"86400\",\n\t\t\t\t\t\t\"Vary\": \"Origin\"\n\t\t\t\t\t};\n\n\t\t\t\t\t// Use custom headers if provided, otherwise use defaults\n\t\t\t\t\tconst responseHeaders = options.headers?.response || defaultHeaders;\n\n\t\t\t\t\t// Create or get existing preview URL using Blaxel's preview API\n\t\t\t\t\tconst preview = await sandbox.previews.createIfNotExists({\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tname: `preview-port-${options.port}-${isPublic ? 'public' : 'private'}`\n\t\t\t\t\t\t},\n\t\t\t\t\t\tspec: {\n\t\t\t\t\t\t\tport: options.port,\n\t\t\t\t\t\t\tpublic: isPublic,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\trequestHeaders: options.headers?.request || defaultHeaders,\n\t\t\t\t\t\t\tcustomDomain: options.customDomain,\n\t\t\t\t\t\t\tprefixUrl: options.prefixUrl,\n\t\t\t\t\t\t\tttl: options.ttl ? `${Math.ceil(options.ttl / 1000)}s` : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Get the preview URL\n\t\t\t\t\tconst url = preview.spec?.url;\n\t\t\t\t\tif (!url) {\n\t\t\t\t\t\tthrow new Error(`Failed to get preview URL for port ${options.port}`);\n\t\t\t\t\t}\n\n\t\t\t\t\t// For private previews, create an access token and append it to the URL\n\t\t\t\t\tif (!isPublic) {\n\t\t\t\t\t\t// Create token with specified expiry (default 60 minutes)\n\t\t\t\t\t\tconst expiryMinutes = options.authentication?.tokenExpiryMinutes || 60;\n\t\t\t\t\t\tconst expiresAt = new Date(Date.now() + expiryMinutes * 60 * 1000);\n\t\t\t\t\t\tconst token = await preview.tokens.create(expiresAt);\n\n\t\t\t\t\t\t// Return URL with token as query parameter\n\t\t\t\t\t\tconst separator = url.includes('?') ? '&' : '?';\n\t\t\t\t\t\treturn `${url}${separator}bl_preview_token=${token.value}`;\n\t\t\t\t\t}\n\n\t\t\t\t\t// For public previews, just return the URL\n\t\t\t\t\treturn url;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to get Blaxel preview URL for port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Optional filesystem methods - implement using Blaxel's filesystem API\n\t\t\tfilesystem: {\n\t\t\t\treadFile: async (sandbox: SandboxInstance, path: string): Promise<string> => {\n\t\t\t\t\tconst result = await sandbox.fs.read(path);\n\t\t\t\t\treturn result || '';\n\t\t\t\t},\n\n\t\t\t\twriteFile: async (sandbox: SandboxInstance, path: string, content: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.write(path, content);\n\t\t\t\t},\n\n\t\t\t\tmkdir: async (sandbox: SandboxInstance, path: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.mkdir(path);\n\t\t\t\t},\n\n\t\t\t\treaddir: async (sandbox: SandboxInstance, path: string): Promise<FileEntry[]> => {\n\t\t\t\t\tconst result = await sandbox.fs.ls(path);\n\t\t\t\t\tconst files = result.files || [];\n\t\t\t\t\tconst directories = result.subdirectories || [];\n\t\t\t\t\tlet entries = [];\n\t\t\t\t\tfor (const file of files) {\n\t\t\t\t\t\tentries.push({\n\t\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\t\ttype: 'file' as const,\n\t\t\t\t\t\t\tsize: file.size || 0,\n\t\t\t\t\t\t\tmodified: new Date(file.lastModified || Date.now())\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tfor (const directory of directories) {\n\t\t\t\t\t\tentries.push({\n\t\t\t\t\t\t\tname: directory.name,\n\t\t\t\t\t\t\ttype: 'directory' as const,\n\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\tmodified: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn entries;\n\t\t\t\t},\n\n\t\t\t\texists: async (sandbox: SandboxInstance, path: string): Promise<boolean> => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait sandbox.fs.read(path);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait sandbox.fs.ls(path);\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tremove: async (sandbox: SandboxInstance, path: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.rm(path);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Provider-specific typed getInstance method\n\t\t\tgetInstance: (sandbox: SandboxInstance): SandboxInstance => {\n\t\t\t\treturn sandbox;\n\t\t\t},\n\t\t},\n\n\t\tsnapshot: {\n\t\t\tcreate: async (config: BlaxelConfig, sandboxId: string, options?: { name?: string }) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\t\n\t\t\t\t\tconst sandbox = await SandboxInstance.get(sandboxId);\n\t\t\t\t\t\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\tthrow new Error(`Sandbox ${sandboxId} not found`);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: sandboxId,\n\t\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tname: options?.name,\n\t\t\t\t\t\t\timage: sandbox.spec?.runtime?.image\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to create Blaxel snapshot: ${error instanceof Error ? error.message : String(error)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tlist: async (config: BlaxelConfig) => {\n\t\t\t\tinitializeBlaxel(config);\n\t\t\t\tconst sandboxList = await SandboxInstance.list();\n\t\t\t\treturn sandboxList.map(sandbox => ({\n\t\t\t\t\tid: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\tcreatedAt: sandbox.metadata?.createdAt ? new Date(sandbox.metadata.createdAt) : new Date(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\timage: sandbox.spec?.runtime?.image,\n\t\t\t\t\t\tstatus: sandbox.status\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tdelete: async (config: BlaxelConfig, snapshotId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tawait SandboxInstance.delete(snapshotId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Ignore if not found\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Templates in Blaxel are pre-configured images\n\t\ttemplate: {\n\t\t\tcreate: async (_config: BlaxelConfig, _options: { name: string }) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel templates must be created via the Blaxel dashboard or CLI. Use image in sandbox.create() to specify a base image.`\n\t\t\t\t);\n\t\t\t},\n\n\t\t\tlist: async (_config: BlaxelConfig) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel provider does not support listing templates via API. Use the dashboard to manage templates.`\n\t\t\t\t);\n\t\t\t},\n\n\t\t\tdelete: async (_config: BlaxelConfig, _templateId: string) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel templates must be deleted via the Blaxel dashboard or CLI.`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/**\n * Parse TTL value from Blaxel's format to milliseconds\n */\nfunction parseTTLToMilliseconds(ttl: string | number | undefined): number {\n\tif (!ttl) return 300000;\n\tif (typeof ttl === 'number') return ttl * 1000;\n\tconst match = ttl.match(/^(\\d+)([smhd])?$/);\n\tif (!match) return 300000;\n\tconst value = parseInt(match[1], 10);\n\tconst unit = match[2] || 's';\n\tswitch (unit) {\n\t\tcase 's': return value * 1000;\n\t\tcase 'm': return value * 60 * 1000;\n\t\tcase 'h': return value * 60 * 60 * 1000;\n\t\tcase 'd': return value * 24 * 60 * 60 * 1000;\n\t\tdefault: return 300000;\n\t}\n}\n\n/**\n * Initialize the Blaxel SDK with credentials from config or environment variables\n */\nfunction initializeBlaxel(config: BlaxelConfig): void {\n\tconst apiKey = config.apiKey || process.env?.BL_API_KEY!;\n\tconst workspace = config.workspace || process.env?.BL_WORKSPACE!;\n\tinitialize({ apikey: apiKey, workspace: workspace });\n}\n\nfunction convertSandboxStatus(status: string | undefined): 'running' | 'stopped' | 'error' {\n\tswitch (status?.toLowerCase()) {\n\t\tcase 'deployed': return 'running';\n\t\tcase 'deleting': return 'stopped';\n\t\tcase 'failed': return 'error';\n\t\tdefault: return 'running';\n\t}\n}\n\n/**\n * Execute a command in the sandbox and capture stdout/stderr\n */\nasync function executeWithStreaming(\n\tsandbox: SandboxInstance,\n\tcommand: string\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n\tconst processResult = await sandbox.process.exec({\n\t\tcommand,\n\t\twaitForCompletion: true,\n\t});\n\tconst result = processResult as { stdout?: string; stderr?: string; exitCode?: number };\n\treturn {\n\t\tstdout: result.stdout || '',\n\t\tstderr: result.stderr || '',\n\t\texitCode: result.exitCode || 0,\n\t};\n}\n\n// Export the Blaxel SandboxInstance type for explicit typing\nexport type { SandboxInstance as BlaxelSandbox } from '@blaxel/core';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Blaxel Provider - Factory-based Implementation\n * \n * Full-featured provider with filesystem support using the factory pattern.\n */\n\nimport { SandboxInstance, initialize } from '@blaxel/core';\nimport { defineProvider, escapeShellArg } from '@computesdk/provider';\n\nimport type { CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions, CreateSnapshotOptions, ListSnapshotsOptions } from '@computesdk/provider';\n\n/**\n * Blaxel-specific configuration options\n */\nexport interface BlaxelConfig {\n\t/** Blaxel workspace ID - if not provided, will fallback to BL_WORKSPACE environment variable */\n\tworkspace?: string;\n\t/** Blaxel API key - if not provided, will fallback to BL_API_KEY environment variable */\n\tapiKey?: string;\n\t/** Default image for sandboxes */\n\timage?: string;\n\t/** Default region for sandbox deployment */\n\tregion?: string;\n\t/** Default memory allocation in MB */\n\tmemory?: number | 4096;\n\t/** Default ports for sandbox */\n\tports?: number[] | [3000];\n}\n\n/**\n * Create a Blaxel provider instance using the factory pattern\n */\nexport const blaxel = defineProvider<SandboxInstance, BlaxelConfig, any, any>({\n\tname: 'blaxel',\n\tmethods: {\n\t\tsandbox: {\n\t\t\t// Collection operations (map to compute.sandbox.*)\n\t\t\tcreate: async (config: BlaxelConfig, options?: CreateSandboxOptions) => {\n\t\t\t\t// Destructure known ComputeSDK fields, collect the rest for passthrough\n\t\t\t\tconst {\n\t\t\t\t\ttimeout: optTimeout,\n\t\t\t\t\tenvs,\n\t\t\t\t\tname: _name,\n\t\t\t\t\tmetadata,\n\t\t\t\t\ttemplateId: _templateId,\n\t\t\t\t\tsnapshotId,\n\t\t\t\t\tsandboxId: optSandboxId,\n\t\t\t\t\tnamespace: _namespace,\n\t\t\t\t\tdirectory: _directory,\n\t\t\t\t\t...providerOptions\n\t\t\t\t} = options || {};\n\n\t\t\t\tconst optRuntime = (options as any)?.runtime as string | undefined;\n\n\t\t\t\t// Determine the image to use\n\t\t\t\tlet image = config.image || 'blaxel/base-image:latest'; // Default to prod-base\n\n\t\t\t\t// Override with runtime-specific image if runtime is specified and no explicit image\n\t\t\t\tif (!config.image && optRuntime) {\n\t\t\t\t\tswitch (optRuntime) {\n\t\t\t\t\t\tcase 'python':\n\t\t\t\t\t\t\timage = 'blaxel/py-app:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'node':\n\t\t\t\t\t\t\timage = 'blaxel/ts-app:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\timage = 'blaxel/base-image:latest';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst memory = config.memory;\n\t\t\t\tconst region = config.region;\n\t\t\t\tconst ttl = optTimeout ? `${Math.ceil(optTimeout / 1000)}s` : undefined;\n\n\t\t\ttry {\n\t\t\t\t// Initialize Blaxel SDK with credentials\n\t\t\t\tinitializeBlaxel(config);\n\n\t\t\t\tlet sandbox: SandboxInstance;\n\n\t\t\t\t// Check if we should resume an existing sandbox or create new\n\t\t\t\tconst existingId = optSandboxId || snapshotId;\n\t\t\t\t\n\t\t\t\tif (existingId) {\n\t\t\t\t\t// Resume existing sandbox or snapshot\n\t\t\t\t\tsandbox = await SandboxInstance.get(existingId);\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\tthrow new Error(`Sandbox ${existingId} not found`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Create new Blaxel sandbox\n\t\t\t\t\tsandbox = await SandboxInstance.createIfNotExists({\n\t\t\t\t\t\timage,\n\t\t\t\t\t\tmemory,\n\t\t\t\t\t\tenvs: Object.entries(envs || {}).map(([name, value]) => ({ name, value: value as string })),\n\t\t\t\t\t\t...(metadata?.labels && { labels: metadata.labels }),\n\t\t\t\t\t\tttl,\n\t\t\t\t\t\tports: config.ports?.map(port => ({ target: port, protocol: 'HTTP' })),\n\t\t\t\t\t\t...(region && { region }),\n\t\t\t\t\t\t...providerOptions, // Spread provider-specific options\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsandbox,\n\t\t\t\t\tsandboxId: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\t\tconst errorDetail = error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: typeof error === 'object' && error !== null\n\t\t\t\t\t\t\t? JSON.stringify(error)\n\t\t\t\t\t\t\t: String(error);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\terrorDetail.includes('unauthorized') ||\n\t\t\t\t\t\terrorDetail.includes('Unauthorized') ||\n\t\t\t\t\t\terrorDetail.includes('Forbidden') ||\n\t\t\t\t\t\terrorDetail.includes('API key')\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Blaxel authentication failed: ${errorDetail}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (errorDetail.includes('quota') || errorDetail.includes('limit')) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Blaxel quota exceeded: ${errorDetail}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to create Blaxel sandbox: ${errorDetail}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tgetById: async (config: BlaxelConfig, sandboxId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tconst sandbox = await SandboxInstance.get(sandboxId);\n\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsandbox,\n\t\t\t\t\t\tsandboxId,\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Sandbox doesn't exist or can't be accessed\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tlist: async (config: BlaxelConfig) => {\n\t\t\t\tinitializeBlaxel(config);\n\t\t\t\tconst sandboxList = await listAllSandboxes();\n\t\t\t\treturn sandboxList.map(sandbox => ({\n\t\t\t\t\tsandbox,\n\t\t\t\t\tsandboxId: sandbox.metadata?.name || 'blaxel-unknown'\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tdestroy: async (config: BlaxelConfig, sandboxId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tawait SandboxInstance.delete(sandboxId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Sandbox might already be destroyed or doesn't exist\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Instance operations (map to individual Sandbox methods)\n\t\trunCommand: async (sandbox: SandboxInstance, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n\t\t\tconst startTime = Date.now();\n\n\t\t\ttry {\n\t\t\t\t// Build command with options\n\t\t\t\tlet fullCommand = command;\n\t\t\t\t\n\t\t\t\t// Handle environment variables\n\t\t\t\tif (options?.env && Object.keys(options.env).length > 0) {\n\t\t\t\t\tconst envPrefix = Object.entries(options.env)\n\t\t\t\t\t\t.map(([k, v]) => `${k}=\"${escapeShellArg(v)}\"`)\n\t\t\t\t\t\t.join(' ');\n\t\t\t\t\tfullCommand = `${envPrefix} ${fullCommand}`;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Handle working directory\n\t\t\t\tif (options?.cwd) {\n\t\t\t\t\tfullCommand = `cd \"${escapeShellArg(options.cwd)}\" && ${fullCommand}`;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Handle background execution\n\t\t\t\tif (options?.background) {\n\t\t\t\t\tfullCommand = `nohup ${fullCommand} > /dev/null 2>&1 &`;\n\t\t\t\t}\n\n\t\t\t\tconst { stdout, stderr, exitCode } = await executeWithStreaming(sandbox, fullCommand);\n\n\t\t\t\treturn {\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr,\n\t\t\t\t\texitCode,\n\t\t\t\t\tdurationMs: Date.now() - startTime\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tstdout: '',\n\t\t\t\t\tstderr: error instanceof Error ? error.message : String(error),\n\t\t\t\t\texitCode: 127,\n\t\t\t\t\tdurationMs: Date.now() - startTime\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\t\tgetInfo: async (sandbox: SandboxInstance): Promise<SandboxInfo> => {\n\t\t\t\tconst runtime = sandbox.spec?.runtime?.image?.includes('py') ? 'python' : 'node';\n\t\t\t\treturn {\n\t\t\t\t\tid: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\tstatus: convertSandboxStatus(sandbox.status),\n\t\t\t\t\tcreatedAt: sandbox.metadata?.createdAt ? new Date(sandbox.metadata.createdAt) : new Date(),\n\t\t\t\t\ttimeout: parseTTLToMilliseconds(sandbox.spec?.runtime?.ttl),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\truntime,\n\t\t\t\t\t\t...sandbox.metadata?.labels\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tgetUrl: async (sandbox: SandboxInstance, options: {\n\t\t\t\tport: number;\n\t\t\t\tttl?: number;\n\t\t\t\tprefixUrl?: string;\n\t\t\t\theaders?: {\n\t\t\t\t\tresponse?: Record<string, string>;\n\t\t\t\t\trequest?: Record<string, string>;\n\t\t\t\t};\n\t\t\t\tcustomDomain?: string;\n\t\t\t\tauthentication?: {\n\t\t\t\t\tpublic?: boolean;\n\t\t\t\t\ttokenExpiryMinutes?: number;\n\t\t\t\t};\n\t\t\t}): Promise<string> => {\n\t\t\t\ttry {\n\t\t\t\t\t// If public is not set, default to true\n\t\t\t\t\tconst isPublic = options.authentication?.public !== undefined ? options.authentication.public : true;\n\n\t\t\t\t\t// Default CORS headers for broad compatibility\n\t\t\t\t\tconst defaultHeaders = {\n\t\t\t\t\t\t\"Access-Control-Allow-Origin\": \"*\",\n\t\t\t\t\t\t\"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, OPTIONS, PATCH\",\n\t\t\t\t\t\t\"Access-Control-Allow-Headers\": \"Content-Type, Authorization, X-Requested-With, X-Blaxel-Preview-Token, X-Blaxel-Authorization\",\n\t\t\t\t\t\t\"Access-Control-Allow-Credentials\": \"true\",\n\t\t\t\t\t\t\"Access-Control-Expose-Headers\": \"Content-Length, X-Request-Id\",\n\t\t\t\t\t\t\"Access-Control-Max-Age\": \"86400\",\n\t\t\t\t\t\t\"Vary\": \"Origin\"\n\t\t\t\t\t};\n\n\t\t\t\t\t// Use custom headers if provided, otherwise use defaults\n\t\t\t\t\tconst responseHeaders = options.headers?.response || defaultHeaders;\n\n\t\t\t\t\t// Create or get existing preview URL using Blaxel's preview API\n\t\t\t\t\tconst preview = await sandbox.previews.createIfNotExists({\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tname: `preview-port-${options.port}-${isPublic ? 'public' : 'private'}`\n\t\t\t\t\t\t},\n\t\t\t\t\t\tspec: {\n\t\t\t\t\t\t\tport: options.port,\n\t\t\t\t\t\t\tpublic: isPublic,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\trequestHeaders: options.headers?.request || defaultHeaders,\n\t\t\t\t\t\t\tcustomDomain: options.customDomain,\n\t\t\t\t\t\t\tprefixUrl: options.prefixUrl,\n\t\t\t\t\t\t\tttl: options.ttl ? `${Math.ceil(options.ttl / 1000)}s` : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Get the preview URL\n\t\t\t\t\tconst url = preview.spec?.url;\n\t\t\t\t\tif (!url) {\n\t\t\t\t\t\tthrow new Error(`Failed to get preview URL for port ${options.port}`);\n\t\t\t\t\t}\n\n\t\t\t\t\t// For private previews, create an access token and append it to the URL\n\t\t\t\t\tif (!isPublic) {\n\t\t\t\t\t\t// Create token with specified expiry (default 60 minutes)\n\t\t\t\t\t\tconst expiryMinutes = options.authentication?.tokenExpiryMinutes || 60;\n\t\t\t\t\t\tconst expiresAt = new Date(Date.now() + expiryMinutes * 60 * 1000);\n\t\t\t\t\t\tconst token = await preview.tokens.create(expiresAt);\n\n\t\t\t\t\t\t// Return URL with token as query parameter\n\t\t\t\t\t\tconst separator = url.includes('?') ? '&' : '?';\n\t\t\t\t\t\treturn `${url}${separator}bl_preview_token=${token.value}`;\n\t\t\t\t\t}\n\n\t\t\t\t\t// For public previews, just return the URL\n\t\t\t\t\treturn url;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to get Blaxel preview URL for port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Optional filesystem methods - implement using Blaxel's filesystem API\n\t\t\tfilesystem: {\n\t\t\t\treadFile: async (sandbox: SandboxInstance, path: string): Promise<string> => {\n\t\t\t\t\tconst result = await sandbox.fs.read(path);\n\t\t\t\t\treturn result || '';\n\t\t\t\t},\n\n\t\t\t\twriteFile: async (sandbox: SandboxInstance, path: string, content: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.write(path, content);\n\t\t\t\t},\n\n\t\t\t\tmkdir: async (sandbox: SandboxInstance, path: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.mkdir(path);\n\t\t\t\t},\n\n\t\t\t\treaddir: async (sandbox: SandboxInstance, path: string): Promise<FileEntry[]> => {\n\t\t\t\t\tconst result = await sandbox.fs.ls(path);\n\t\t\t\t\tconst files = result.files || [];\n\t\t\t\t\tconst directories = result.subdirectories || [];\n\t\t\t\t\tlet entries = [];\n\t\t\t\t\tfor (const file of files) {\n\t\t\t\t\t\tentries.push({\n\t\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\t\ttype: 'file' as const,\n\t\t\t\t\t\t\tsize: file.size || 0,\n\t\t\t\t\t\t\tmodified: new Date(file.lastModified || Date.now())\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tfor (const directory of directories) {\n\t\t\t\t\t\tentries.push({\n\t\t\t\t\t\t\tname: directory.name,\n\t\t\t\t\t\t\ttype: 'directory' as const,\n\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\tmodified: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn entries;\n\t\t\t\t},\n\n\t\t\t\texists: async (sandbox: SandboxInstance, path: string): Promise<boolean> => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait sandbox.fs.read(path);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait sandbox.fs.ls(path);\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tremove: async (sandbox: SandboxInstance, path: string): Promise<void> => {\n\t\t\t\t\tawait sandbox.fs.rm(path);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Provider-specific typed getInstance method\n\t\t\tgetInstance: (sandbox: SandboxInstance): SandboxInstance => {\n\t\t\t\treturn sandbox;\n\t\t\t},\n\t\t},\n\n\t\tsnapshot: {\n\t\t\tcreate: async (config: BlaxelConfig, sandboxId: string, options?: { name?: string }) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\t\n\t\t\t\t\tconst sandbox = await SandboxInstance.get(sandboxId);\n\t\t\t\t\t\n\t\t\t\t\tif (!sandbox) {\n\t\t\t\t\t\tthrow new Error(`Sandbox ${sandboxId} not found`);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: sandboxId,\n\t\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tname: options?.name,\n\t\t\t\t\t\t\timage: sandbox.spec?.runtime?.image\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to create Blaxel snapshot: ${error instanceof Error ? error.message : String(error)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tlist: async (config: BlaxelConfig) => {\n\t\t\t\tinitializeBlaxel(config);\n\t\t\t\tconst sandboxList = await listAllSandboxes();\n\t\t\t\treturn sandboxList.map(sandbox => ({\n\t\t\t\t\tid: sandbox.metadata?.name || 'blaxel-unknown',\n\t\t\t\t\tprovider: 'blaxel',\n\t\t\t\t\tcreatedAt: sandbox.metadata?.createdAt ? new Date(sandbox.metadata.createdAt) : new Date(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\timage: sandbox.spec?.runtime?.image,\n\t\t\t\t\t\tstatus: sandbox.status\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tdelete: async (config: BlaxelConfig, snapshotId: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tinitializeBlaxel(config);\n\t\t\t\t\tawait SandboxInstance.delete(snapshotId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Ignore if not found\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Templates in Blaxel are pre-configured images\n\t\ttemplate: {\n\t\t\tcreate: async (_config: BlaxelConfig, _options: { name: string }) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel templates must be created via the Blaxel dashboard or CLI. Use image in sandbox.create() to specify a base image.`\n\t\t\t\t);\n\t\t\t},\n\n\t\t\tlist: async (_config: BlaxelConfig) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel provider does not support listing templates via API. Use the dashboard to manage templates.`\n\t\t\t\t);\n\t\t\t},\n\n\t\t\tdelete: async (_config: BlaxelConfig, _templateId: string) => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Blaxel templates must be deleted via the Blaxel dashboard or CLI.`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/**\n * Collect all sandboxes across pages — since @blaxel/core 0.3.x, list()\n * returns a cursor-paginated, auto-paging async iterable instead of an array.\n */\nasync function listAllSandboxes(): Promise<SandboxInstance[]> {\n\tconst sandboxes: SandboxInstance[] = [];\n\tfor await (const sandbox of await SandboxInstance.list()) {\n\t\tsandboxes.push(sandbox);\n\t}\n\treturn sandboxes;\n}\n\n/**\n * Parse TTL value from Blaxel's format to milliseconds\n */\nfunction parseTTLToMilliseconds(ttl: string | number | undefined): number {\n\tif (!ttl) return 300000;\n\tif (typeof ttl === 'number') return ttl * 1000;\n\tconst match = ttl.match(/^(\\d+)([smhd])?$/);\n\tif (!match) return 300000;\n\tconst value = parseInt(match[1], 10);\n\tconst unit = match[2] || 's';\n\tswitch (unit) {\n\t\tcase 's': return value * 1000;\n\t\tcase 'm': return value * 60 * 1000;\n\t\tcase 'h': return value * 60 * 60 * 1000;\n\t\tcase 'd': return value * 24 * 60 * 60 * 1000;\n\t\tdefault: return 300000;\n\t}\n}\n\n/**\n * Initialize the Blaxel SDK with credentials from config or environment variables\n */\nfunction initializeBlaxel(config: BlaxelConfig): void {\n\tconst apiKey = config.apiKey || process.env?.BL_API_KEY!;\n\tconst workspace = config.workspace || process.env?.BL_WORKSPACE!;\n\tinitialize({ apikey: apiKey, workspace: workspace });\n}\n\nfunction convertSandboxStatus(status: string | undefined): 'running' | 'stopped' | 'error' {\n\tswitch (status?.toLowerCase()) {\n\t\tcase 'deployed': return 'running';\n\t\tcase 'deleting': return 'stopped';\n\t\tcase 'failed': return 'error';\n\t\tdefault: return 'running';\n\t}\n}\n\n/**\n * Execute a command in the sandbox and capture stdout/stderr\n */\nasync function executeWithStreaming(\n\tsandbox: SandboxInstance,\n\tcommand: string\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n\tconst processResult = await sandbox.process.exec({\n\t\tcommand,\n\t\twaitForCompletion: true,\n\t});\n\tconst result = processResult as { stdout?: string; stderr?: string; exitCode?: number };\n\treturn {\n\t\tstdout: result.stdout || '',\n\t\tstderr: result.stderr || '',\n\t\texitCode: result.exitCode || 0,\n\t};\n}\n\n// Export the Blaxel SandboxInstance type for explicit typing\nexport type { SandboxInstance as BlaxelSandbox } from '@blaxel/core';\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@computesdk/blaxel",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.18",
|
|
4
4
|
"description": "Blaxel provider for ComputeSDK - lightweight cloud sandboxes for code execution",
|
|
5
5
|
"author": "ComputeSDK",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@blaxel/core": "^0.
|
|
22
|
-
"@computesdk/provider": "2.1.
|
|
23
|
-
"computesdk": "4.1.
|
|
21
|
+
"@blaxel/core": "^0.3.3",
|
|
22
|
+
"@computesdk/provider": "2.1.4",
|
|
23
|
+
"computesdk": "4.1.4"
|
|
24
24
|
},
|
|
25
25
|
"keywords": [
|
|
26
26
|
"computesdk",
|