@computesdk/lambda 1.0.0 → 1.1.1
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.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Lambda Provider - Factory-based Implementation\n * \n * Curl Command to start instance with Node:Alpine\n * curl --request POST \\\n --url 'https://cloud.lambda.ai/api/v1/instance-operations/launch' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"region_name\": LAMBDA_REGION_NAME,\n \"instance_type_name\": LAMBDA_INSTANCE_TYPE_NAME,\n \"ssh_key_names\": [\"LAMBDA_SSH_KEY_NAME\"],\n \"name\": \"node-alpine-instance\",\n \"user_data\": \"#!/bin/bash\\napt-get update\\napt-get install -y docker.io\\nsystemctl start docker\\nsystemctl enable docker\\ndocker pull node:alpine\\ndocker run -d --name node-app node:alpine tail -f /dev/null\"\n }'\n *\n * Curl Command to list instances\n * curl --request GET \\\n --url 'https://cloud.lambda.ai/api/v1/instances' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY'\n *\n * Curl Command to getById()\n * curl --request GET \\\n --url 'https://cloud.lambda.ai/api/v1/instances/<INSTANCE-ID>' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY'\n *\n * Curl Command to Destroy Instance (terminate)\n * curl --request POST \\\n --url 'https://cloud.lambda.ai/api/v1/instance-operations/terminate' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"instance_ids\": [\"<YOUR-INSTANCE-ID>\"]\n }'\n */\n\nimport { createProvider } from 'computesdk';\nimport type { Runtime, ExecutionResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions } from 'computesdk';\n\n/**\n * Lambda sandbox interface\n */\ninterface LambdaSandbox {\n instanceId: string;\n regionName: string;\n instanceTypeName: string;\n}\n\nexport interface LambdaConfig {\n /** Lambda API key - if not provided, will fallback to LAMBDA_API_KEY environment variable */\n apiKey?: string;\n /** Lambda Region Name - if not provided, will fallback to LAMBDA_REGION_NAME environment variable */\n regionName?: string;\n /** Lambda Instance Type Name - if not provided, will fallback to LAMBDA_INSTANCE_TYPE_NAME environment variable */\n instanceTypeName?: string;\n /** Lambda SSH Key Name - if not provided, will fallback to LAMBDA_SSH_KEY_NAME environment variable */\n sshKeyName?: string;\n}\n\nexport const getAndValidateCredentials = (config: LambdaConfig) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.LAMBDA_API_KEY) || '';\n const regionName = config.regionName || (typeof process !== 'undefined' && process.env?.LAMBDA_REGION_NAME) || '';\n const instanceTypeName = config.instanceTypeName || (typeof process !== 'undefined' && process.env?.LAMBDA_INSTANCE_TYPE_NAME) || '';\n const sshKeyName = config.sshKeyName || (typeof process !== 'undefined' && process.env?.LAMBDA_SSH_KEY_NAME) || '';\n\n if (!apiKey) {\n throw new Error(\n 'Missing Lambda API key. Provide apiKey in config or set LAMBDA_API_KEY environment variable.'\n );\n }\n\n if (!regionName) {\n throw new Error(\n 'Missing Lambda Region Name. Provide regionName in config or set LAMBDA_REGION_NAME environment variable.'\n );\n }\n\n if (!instanceTypeName) {\n throw new Error(\n 'Missing Lambda Instance Type Name. Provide instanceTypeName in config or set LAMBDA_INSTANCE_TYPE_NAME environment variable.'\n );\n }\n\n if (!sshKeyName) {\n throw new Error(\n 'Missing Lambda SSH Key Name. Provide sshKeyName in config or set LAMBDA_SSH_KEY_NAME environment variable.'\n );\n }\n\n return { apiKey, regionName, instanceTypeName, sshKeyName };\n};\n\nconst LAMBDA_API_ENDPOINTS = {\n LAUNCH_INSTANCE: 'https://cloud.lambda.ai/api/v1/instance-operations/launch',\n LIST_INSTANCES: 'https://cloud.lambda.ai/api/v1/instances',\n GET_INSTANCE: (instanceId: string) => `https://cloud.lambda.ai/api/v1/instances/${instanceId}`,\n TERMINATE_INSTANCES: 'https://cloud.lambda.ai/api/v1/instance-operations/terminate'\n};\n\nconst handleLambdaAPIError = (response: Response, data?: any) => {\n if (!response.ok) {\n let errorMessage;\n if (data?.error) {\n // Handle Lambda API error format: { \"error\": { \"code\": \"...\", \"message\": \"...\", \"suggestion\": \"...\" } }\n if (typeof data.error === 'object' && data.error.message) {\n errorMessage = `${data.error.message}${data.error.suggestion ? ` ${data.error.suggestion}` : ''} (${data.error.code || 'unknown'})`;\n } else {\n errorMessage = JSON.stringify(data.error);\n }\n } else {\n errorMessage = data?.message || `HTTP ${response.status} ${response.statusText}`;\n }\n throw new Error(`Lambda API error: ${errorMessage}`);\n }\n};\n\n\nexport const fetchLambda = async (\n apiKey: string,\n endpoint: string,\n options: {\n method?: string;\n body?: any;\n } = {}\n) => {\n const { method = 'GET', body } = options;\n \n const response = await fetch(endpoint, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n ...(body ? { body: JSON.stringify(body) } : {})\n });\n\n const data = await response.json();\n\n // Handle Lambda API errors\n handleLambdaAPIError(response, data);\n\n return data;\n};\n\n\n\n/**\n * Create a Lambda provider instance using the factory pattern\n */\nexport const lambda = createProvider<LambdaSandbox, LambdaConfig>({\n name: 'lambda',\n methods: {\n sandbox: {\n // Collection operations (compute.sandbox.*)\n create: async (config: LambdaConfig, options?: CreateSandboxOptions) => {\n const { apiKey, regionName, instanceTypeName, sshKeyName } = getAndValidateCredentials(config);\n\n try {\n const dockerImage = options?.runtime === 'node' ? 'node:alpine' : 'python:alpine';\n const userData = `#!/bin/bash\napt-get update\napt-get install -y docker.io\nsystemctl start docker\nsystemctl enable docker\ndocker pull ${dockerImage}\ndocker run -d --name compute-app ${dockerImage} tail -f /dev/null`;\n\n const launchBody = {\n region_name: regionName,\n instance_type_name: instanceTypeName,\n ssh_key_names: [sshKeyName],\n name: `compute-${options?.runtime || 'node'}-instance`,\n user_data: userData\n };\n\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.LAUNCH_INSTANCE, {\n method: 'POST',\n body: launchBody\n });\n \n // Lambda API returns instance_ids as an array\n const instanceIds = responseData?.data?.instance_ids;\n if (!instanceIds || !Array.isArray(instanceIds) || instanceIds.length === 0) {\n throw new Error(`No instance IDs returned from Lambda API. Full response: ${JSON.stringify(responseData)}`);\n }\n\n // Take the first instance ID (should only be one for single instance creation)\n const instanceId = instanceIds[0];\n\n const lambdaSandbox: LambdaSandbox = {\n instanceId,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n throw new Error(\n `Failed to create Lambda sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: LambdaConfig, sandboxId: string) => {\n const { apiKey, regionName, instanceTypeName } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.GET_INSTANCE(sandboxId));\n \n // Lambda API returns the instance directly in data (single instance, not array)\n const instance = responseData?.data;\n if (!instance) {\n return null;\n }\n \n if (!instance.id) {\n throw new Error('Instance data is missing ID from Lambda response');\n }\n\n const lambdaSandbox: LambdaSandbox = {\n instanceId: instance.id,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instance.id\n };\n } catch (error) {\n // Return null for 404s (instance not found)\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('Not Found'))) {\n return null;\n }\n throw new Error(\n `Failed to get Lambda sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: LambdaConfig) => {\n const { apiKey, regionName, instanceTypeName } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.LIST_INSTANCES);\n \n // Lambda API returns instances directly in data array\n const instances = responseData?.data || [];\n \n if (!Array.isArray(instances)) {\n throw new Error(`Expected instances array, got: ${typeof instances}`);\n }\n \n // Transform each instance into the expected format\n const sandboxes = instances.map((instance: any) => {\n const lambdaSandbox: LambdaSandbox = {\n instanceId: instance.id,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instance.id\n };\n });\n\n return sandboxes;\n } catch (error) {\n throw new Error(\n `Failed to list Lambda sandboxes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: LambdaConfig, sandboxId: string) => {\n const { apiKey } = getAndValidateCredentials(config);\n\n try {\n const terminateBody = {\n instance_ids: [sandboxId]\n };\n\n await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.TERMINATE_INSTANCES, {\n method: 'POST',\n body: terminateBody\n });\n } catch (error) {\n // For destroy operations, we typically don't throw if the instance is already gone\n console.warn(`Lambda destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n // Instance operations (minimal stubs - not implemented yet)\n runCode: async (_sandbox: LambdaSandbox, _code: string, _runtime?: Runtime) => {\n throw new Error('Lambda runCode method not implemented yet');\n },\n\n runCommand: async (_sandbox: LambdaSandbox, _command: string, _args?: string[], _options?: RunCommandOptions) => {\n throw new Error('Lambda runCommand method not implemented yet');\n },\n\n getInfo: async (_sandbox: LambdaSandbox) => {\n throw new Error('Lambda getInfo method not implemented yet');\n },\n\n getUrl: async (_sandbox: LambdaSandbox, _options: { port: number; protocol?: string }) => {\n throw new Error('Lambda getUrl method not implemented yet');\n },\n\n },\n },\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Lambda Provider - Factory-based Implementation\n * \n * Curl Command to start instance with Node:Alpine\n * curl --request POST \\\n --url 'https://cloud.lambda.ai/api/v1/instance-operations/launch' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"region_name\": LAMBDA_REGION_NAME,\n \"instance_type_name\": LAMBDA_INSTANCE_TYPE_NAME,\n \"ssh_key_names\": [\"LAMBDA_SSH_KEY_NAME\"],\n \"name\": \"node-alpine-instance\",\n \"user_data\": \"#!/bin/bash\\napt-get update\\napt-get install -y docker.io\\nsystemctl start docker\\nsystemctl enable docker\\ndocker pull node:alpine\\ndocker run -d --name node-app node:alpine tail -f /dev/null\"\n }'\n *\n * Curl Command to list instances\n * curl --request GET \\\n --url 'https://cloud.lambda.ai/api/v1/instances' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY'\n *\n * Curl Command to getById()\n * curl --request GET \\\n --url 'https://cloud.lambda.ai/api/v1/instances/<INSTANCE-ID>' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY'\n *\n * Curl Command to Destroy Instance (terminate)\n * curl --request POST \\\n --url 'https://cloud.lambda.ai/api/v1/instance-operations/terminate' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"instance_ids\": [\"<YOUR-INSTANCE-ID>\"]\n }'\n */\n\nimport { createProvider } from 'computesdk';\nimport type { Runtime, CodeResult, CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions } from 'computesdk';\n\n/**\n * Lambda sandbox interface\n */\ninterface LambdaSandbox {\n instanceId: string;\n regionName: string;\n instanceTypeName: string;\n}\n\nexport interface LambdaConfig {\n /** Lambda API key - if not provided, will fallback to LAMBDA_API_KEY environment variable */\n apiKey?: string;\n /** Lambda Region Name - if not provided, will fallback to LAMBDA_REGION_NAME environment variable */\n regionName?: string;\n /** Lambda Instance Type Name - if not provided, will fallback to LAMBDA_INSTANCE_TYPE_NAME environment variable */\n instanceTypeName?: string;\n /** Lambda SSH Key Name - if not provided, will fallback to LAMBDA_SSH_KEY_NAME environment variable */\n sshKeyName?: string;\n}\n\nexport const getAndValidateCredentials = (config: LambdaConfig) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.LAMBDA_API_KEY) || '';\n const regionName = config.regionName || (typeof process !== 'undefined' && process.env?.LAMBDA_REGION_NAME) || '';\n const instanceTypeName = config.instanceTypeName || (typeof process !== 'undefined' && process.env?.LAMBDA_INSTANCE_TYPE_NAME) || '';\n const sshKeyName = config.sshKeyName || (typeof process !== 'undefined' && process.env?.LAMBDA_SSH_KEY_NAME) || '';\n\n if (!apiKey) {\n throw new Error(\n 'Missing Lambda API key. Provide apiKey in config or set LAMBDA_API_KEY environment variable.'\n );\n }\n\n if (!regionName) {\n throw new Error(\n 'Missing Lambda Region Name. Provide regionName in config or set LAMBDA_REGION_NAME environment variable.'\n );\n }\n\n if (!instanceTypeName) {\n throw new Error(\n 'Missing Lambda Instance Type Name. Provide instanceTypeName in config or set LAMBDA_INSTANCE_TYPE_NAME environment variable.'\n );\n }\n\n if (!sshKeyName) {\n throw new Error(\n 'Missing Lambda SSH Key Name. Provide sshKeyName in config or set LAMBDA_SSH_KEY_NAME environment variable.'\n );\n }\n\n return { apiKey, regionName, instanceTypeName, sshKeyName };\n};\n\nconst LAMBDA_API_ENDPOINTS = {\n LAUNCH_INSTANCE: 'https://cloud.lambda.ai/api/v1/instance-operations/launch',\n LIST_INSTANCES: 'https://cloud.lambda.ai/api/v1/instances',\n GET_INSTANCE: (instanceId: string) => `https://cloud.lambda.ai/api/v1/instances/${instanceId}`,\n TERMINATE_INSTANCES: 'https://cloud.lambda.ai/api/v1/instance-operations/terminate'\n};\n\nconst handleLambdaAPIError = (response: Response, data?: any) => {\n if (!response.ok) {\n let errorMessage;\n if (data?.error) {\n // Handle Lambda API error format: { \"error\": { \"code\": \"...\", \"message\": \"...\", \"suggestion\": \"...\" } }\n if (typeof data.error === 'object' && data.error.message) {\n errorMessage = `${data.error.message}${data.error.suggestion ? ` ${data.error.suggestion}` : ''} (${data.error.code || 'unknown'})`;\n } else {\n errorMessage = JSON.stringify(data.error);\n }\n } else {\n errorMessage = data?.message || `HTTP ${response.status} ${response.statusText}`;\n }\n throw new Error(`Lambda API error: ${errorMessage}`);\n }\n};\n\n\nexport const fetchLambda = async (\n apiKey: string,\n endpoint: string,\n options: {\n method?: string;\n body?: any;\n } = {}\n) => {\n const { method = 'GET', body } = options;\n \n const response = await fetch(endpoint, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n ...(body ? { body: JSON.stringify(body) } : {})\n });\n\n const data = await response.json();\n\n // Handle Lambda API errors\n handleLambdaAPIError(response, data);\n\n return data;\n};\n\n\n\n/**\n * Create a Lambda provider instance using the factory pattern\n */\nexport const lambda = createProvider<LambdaSandbox, LambdaConfig>({\n name: 'lambda',\n methods: {\n sandbox: {\n // Collection operations (compute.sandbox.*)\n create: async (config: LambdaConfig, options?: CreateSandboxOptions) => {\n const { apiKey, regionName, instanceTypeName, sshKeyName } = getAndValidateCredentials(config);\n\n try {\n const dockerImage = options?.runtime === 'node' ? 'node:alpine' : 'python:alpine';\n const userData = `#!/bin/bash\napt-get update\napt-get install -y docker.io\nsystemctl start docker\nsystemctl enable docker\ndocker pull ${dockerImage}\ndocker run -d --name compute-app ${dockerImage} tail -f /dev/null`;\n\n const launchBody = {\n region_name: regionName,\n instance_type_name: instanceTypeName,\n ssh_key_names: [sshKeyName],\n name: `compute-${options?.runtime || 'node'}-instance`,\n user_data: userData\n };\n\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.LAUNCH_INSTANCE, {\n method: 'POST',\n body: launchBody\n });\n \n // Lambda API returns instance_ids as an array\n const instanceIds = responseData?.data?.instance_ids;\n if (!instanceIds || !Array.isArray(instanceIds) || instanceIds.length === 0) {\n throw new Error(`No instance IDs returned from Lambda API. Full response: ${JSON.stringify(responseData)}`);\n }\n\n // Take the first instance ID (should only be one for single instance creation)\n const instanceId = instanceIds[0];\n\n const lambdaSandbox: LambdaSandbox = {\n instanceId,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n throw new Error(\n `Failed to create Lambda sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: LambdaConfig, sandboxId: string) => {\n const { apiKey, regionName, instanceTypeName } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.GET_INSTANCE(sandboxId));\n \n // Lambda API returns the instance directly in data (single instance, not array)\n const instance = responseData?.data;\n if (!instance) {\n return null;\n }\n \n if (!instance.id) {\n throw new Error('Instance data is missing ID from Lambda response');\n }\n\n const lambdaSandbox: LambdaSandbox = {\n instanceId: instance.id,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instance.id\n };\n } catch (error) {\n // Return null for 404s (instance not found)\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('Not Found'))) {\n return null;\n }\n throw new Error(\n `Failed to get Lambda sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: LambdaConfig) => {\n const { apiKey, regionName, instanceTypeName } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.LIST_INSTANCES);\n \n // Lambda API returns instances directly in data array\n const instances = responseData?.data || [];\n \n if (!Array.isArray(instances)) {\n throw new Error(`Expected instances array, got: ${typeof instances}`);\n }\n \n // Transform each instance into the expected format\n const sandboxes = instances.map((instance: any) => {\n const lambdaSandbox: LambdaSandbox = {\n instanceId: instance.id,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instance.id\n };\n });\n\n return sandboxes;\n } catch (error) {\n throw new Error(\n `Failed to list Lambda sandboxes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: LambdaConfig, sandboxId: string) => {\n const { apiKey } = getAndValidateCredentials(config);\n\n try {\n const terminateBody = {\n instance_ids: [sandboxId]\n };\n\n await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.TERMINATE_INSTANCES, {\n method: 'POST',\n body: terminateBody\n });\n } catch (error) {\n // For destroy operations, we typically don't throw if the instance is already gone\n console.warn(`Lambda destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n // Instance operations (minimal stubs - not implemented yet)\n runCode: async (_sandbox: LambdaSandbox, _code: string, _runtime?: Runtime) => {\n throw new Error('Lambda runCode method not implemented yet');\n },\n\n runCommand: async (_sandbox: LambdaSandbox, _command: string, _args?: string[], _options?: RunCommandOptions) => {\n throw new Error('Lambda runCommand method not implemented yet');\n },\n\n getInfo: async (_sandbox: LambdaSandbox) => {\n throw new Error('Lambda getInfo method not implemented yet');\n },\n\n getUrl: async (_sandbox: LambdaSandbox, _options: { port: number; protocol?: string }) => {\n throw new Error('Lambda getUrl method not implemented yet');\n },\n\n },\n },\n});\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -66,6 +66,6 @@ declare const fetchLambda: (apiKey: string, endpoint: string, options?: {
|
|
|
66
66
|
/**
|
|
67
67
|
* Create a Lambda provider instance using the factory pattern
|
|
68
68
|
*/
|
|
69
|
-
declare const lambda: (config: LambdaConfig) => computesdk.Provider<LambdaSandbox, any, any>;
|
|
69
|
+
declare const lambda: (config: LambdaConfig & computesdk.BaseProviderConfig) => computesdk.Provider<LambdaSandbox, any, any>;
|
|
70
70
|
|
|
71
71
|
export { type LambdaConfig, fetchLambda, getAndValidateCredentials, lambda };
|
package/dist/index.d.ts
CHANGED
|
@@ -66,6 +66,6 @@ declare const fetchLambda: (apiKey: string, endpoint: string, options?: {
|
|
|
66
66
|
/**
|
|
67
67
|
* Create a Lambda provider instance using the factory pattern
|
|
68
68
|
*/
|
|
69
|
-
declare const lambda: (config: LambdaConfig) => computesdk.Provider<LambdaSandbox, any, any>;
|
|
69
|
+
declare const lambda: (config: LambdaConfig & computesdk.BaseProviderConfig) => computesdk.Provider<LambdaSandbox, any, any>;
|
|
70
70
|
|
|
71
71
|
export { type LambdaConfig, fetchLambda, getAndValidateCredentials, lambda };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Lambda Provider - Factory-based Implementation\n * \n * Curl Command to start instance with Node:Alpine\n * curl --request POST \\\n --url 'https://cloud.lambda.ai/api/v1/instance-operations/launch' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"region_name\": LAMBDA_REGION_NAME,\n \"instance_type_name\": LAMBDA_INSTANCE_TYPE_NAME,\n \"ssh_key_names\": [\"LAMBDA_SSH_KEY_NAME\"],\n \"name\": \"node-alpine-instance\",\n \"user_data\": \"#!/bin/bash\\napt-get update\\napt-get install -y docker.io\\nsystemctl start docker\\nsystemctl enable docker\\ndocker pull node:alpine\\ndocker run -d --name node-app node:alpine tail -f /dev/null\"\n }'\n *\n * Curl Command to list instances\n * curl --request GET \\\n --url 'https://cloud.lambda.ai/api/v1/instances' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY'\n *\n * Curl Command to getById()\n * curl --request GET \\\n --url 'https://cloud.lambda.ai/api/v1/instances/<INSTANCE-ID>' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY'\n *\n * Curl Command to Destroy Instance (terminate)\n * curl --request POST \\\n --url 'https://cloud.lambda.ai/api/v1/instance-operations/terminate' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"instance_ids\": [\"<YOUR-INSTANCE-ID>\"]\n }'\n */\n\nimport { createProvider } from 'computesdk';\nimport type { Runtime, ExecutionResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions } from 'computesdk';\n\n/**\n * Lambda sandbox interface\n */\ninterface LambdaSandbox {\n instanceId: string;\n regionName: string;\n instanceTypeName: string;\n}\n\nexport interface LambdaConfig {\n /** Lambda API key - if not provided, will fallback to LAMBDA_API_KEY environment variable */\n apiKey?: string;\n /** Lambda Region Name - if not provided, will fallback to LAMBDA_REGION_NAME environment variable */\n regionName?: string;\n /** Lambda Instance Type Name - if not provided, will fallback to LAMBDA_INSTANCE_TYPE_NAME environment variable */\n instanceTypeName?: string;\n /** Lambda SSH Key Name - if not provided, will fallback to LAMBDA_SSH_KEY_NAME environment variable */\n sshKeyName?: string;\n}\n\nexport const getAndValidateCredentials = (config: LambdaConfig) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.LAMBDA_API_KEY) || '';\n const regionName = config.regionName || (typeof process !== 'undefined' && process.env?.LAMBDA_REGION_NAME) || '';\n const instanceTypeName = config.instanceTypeName || (typeof process !== 'undefined' && process.env?.LAMBDA_INSTANCE_TYPE_NAME) || '';\n const sshKeyName = config.sshKeyName || (typeof process !== 'undefined' && process.env?.LAMBDA_SSH_KEY_NAME) || '';\n\n if (!apiKey) {\n throw new Error(\n 'Missing Lambda API key. Provide apiKey in config or set LAMBDA_API_KEY environment variable.'\n );\n }\n\n if (!regionName) {\n throw new Error(\n 'Missing Lambda Region Name. Provide regionName in config or set LAMBDA_REGION_NAME environment variable.'\n );\n }\n\n if (!instanceTypeName) {\n throw new Error(\n 'Missing Lambda Instance Type Name. Provide instanceTypeName in config or set LAMBDA_INSTANCE_TYPE_NAME environment variable.'\n );\n }\n\n if (!sshKeyName) {\n throw new Error(\n 'Missing Lambda SSH Key Name. Provide sshKeyName in config or set LAMBDA_SSH_KEY_NAME environment variable.'\n );\n }\n\n return { apiKey, regionName, instanceTypeName, sshKeyName };\n};\n\nconst LAMBDA_API_ENDPOINTS = {\n LAUNCH_INSTANCE: 'https://cloud.lambda.ai/api/v1/instance-operations/launch',\n LIST_INSTANCES: 'https://cloud.lambda.ai/api/v1/instances',\n GET_INSTANCE: (instanceId: string) => `https://cloud.lambda.ai/api/v1/instances/${instanceId}`,\n TERMINATE_INSTANCES: 'https://cloud.lambda.ai/api/v1/instance-operations/terminate'\n};\n\nconst handleLambdaAPIError = (response: Response, data?: any) => {\n if (!response.ok) {\n let errorMessage;\n if (data?.error) {\n // Handle Lambda API error format: { \"error\": { \"code\": \"...\", \"message\": \"...\", \"suggestion\": \"...\" } }\n if (typeof data.error === 'object' && data.error.message) {\n errorMessage = `${data.error.message}${data.error.suggestion ? ` ${data.error.suggestion}` : ''} (${data.error.code || 'unknown'})`;\n } else {\n errorMessage = JSON.stringify(data.error);\n }\n } else {\n errorMessage = data?.message || `HTTP ${response.status} ${response.statusText}`;\n }\n throw new Error(`Lambda API error: ${errorMessage}`);\n }\n};\n\n\nexport const fetchLambda = async (\n apiKey: string,\n endpoint: string,\n options: {\n method?: string;\n body?: any;\n } = {}\n) => {\n const { method = 'GET', body } = options;\n \n const response = await fetch(endpoint, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n ...(body ? { body: JSON.stringify(body) } : {})\n });\n\n const data = await response.json();\n\n // Handle Lambda API errors\n handleLambdaAPIError(response, data);\n\n return data;\n};\n\n\n\n/**\n * Create a Lambda provider instance using the factory pattern\n */\nexport const lambda = createProvider<LambdaSandbox, LambdaConfig>({\n name: 'lambda',\n methods: {\n sandbox: {\n // Collection operations (compute.sandbox.*)\n create: async (config: LambdaConfig, options?: CreateSandboxOptions) => {\n const { apiKey, regionName, instanceTypeName, sshKeyName } = getAndValidateCredentials(config);\n\n try {\n const dockerImage = options?.runtime === 'node' ? 'node:alpine' : 'python:alpine';\n const userData = `#!/bin/bash\napt-get update\napt-get install -y docker.io\nsystemctl start docker\nsystemctl enable docker\ndocker pull ${dockerImage}\ndocker run -d --name compute-app ${dockerImage} tail -f /dev/null`;\n\n const launchBody = {\n region_name: regionName,\n instance_type_name: instanceTypeName,\n ssh_key_names: [sshKeyName],\n name: `compute-${options?.runtime || 'node'}-instance`,\n user_data: userData\n };\n\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.LAUNCH_INSTANCE, {\n method: 'POST',\n body: launchBody\n });\n \n // Lambda API returns instance_ids as an array\n const instanceIds = responseData?.data?.instance_ids;\n if (!instanceIds || !Array.isArray(instanceIds) || instanceIds.length === 0) {\n throw new Error(`No instance IDs returned from Lambda API. Full response: ${JSON.stringify(responseData)}`);\n }\n\n // Take the first instance ID (should only be one for single instance creation)\n const instanceId = instanceIds[0];\n\n const lambdaSandbox: LambdaSandbox = {\n instanceId,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n throw new Error(\n `Failed to create Lambda sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: LambdaConfig, sandboxId: string) => {\n const { apiKey, regionName, instanceTypeName } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.GET_INSTANCE(sandboxId));\n \n // Lambda API returns the instance directly in data (single instance, not array)\n const instance = responseData?.data;\n if (!instance) {\n return null;\n }\n \n if (!instance.id) {\n throw new Error('Instance data is missing ID from Lambda response');\n }\n\n const lambdaSandbox: LambdaSandbox = {\n instanceId: instance.id,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instance.id\n };\n } catch (error) {\n // Return null for 404s (instance not found)\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('Not Found'))) {\n return null;\n }\n throw new Error(\n `Failed to get Lambda sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: LambdaConfig) => {\n const { apiKey, regionName, instanceTypeName } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.LIST_INSTANCES);\n \n // Lambda API returns instances directly in data array\n const instances = responseData?.data || [];\n \n if (!Array.isArray(instances)) {\n throw new Error(`Expected instances array, got: ${typeof instances}`);\n }\n \n // Transform each instance into the expected format\n const sandboxes = instances.map((instance: any) => {\n const lambdaSandbox: LambdaSandbox = {\n instanceId: instance.id,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instance.id\n };\n });\n\n return sandboxes;\n } catch (error) {\n throw new Error(\n `Failed to list Lambda sandboxes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: LambdaConfig, sandboxId: string) => {\n const { apiKey } = getAndValidateCredentials(config);\n\n try {\n const terminateBody = {\n instance_ids: [sandboxId]\n };\n\n await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.TERMINATE_INSTANCES, {\n method: 'POST',\n body: terminateBody\n });\n } catch (error) {\n // For destroy operations, we typically don't throw if the instance is already gone\n console.warn(`Lambda destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n // Instance operations (minimal stubs - not implemented yet)\n runCode: async (_sandbox: LambdaSandbox, _code: string, _runtime?: Runtime) => {\n throw new Error('Lambda runCode method not implemented yet');\n },\n\n runCommand: async (_sandbox: LambdaSandbox, _command: string, _args?: string[], _options?: RunCommandOptions) => {\n throw new Error('Lambda runCommand method not implemented yet');\n },\n\n getInfo: async (_sandbox: LambdaSandbox) => {\n throw new Error('Lambda getInfo method not implemented yet');\n },\n\n getUrl: async (_sandbox: LambdaSandbox, _options: { port: number; protocol?: string }) => {\n throw new Error('Lambda getUrl method not implemented yet');\n },\n\n },\n },\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Lambda Provider - Factory-based Implementation\n * \n * Curl Command to start instance with Node:Alpine\n * curl --request POST \\\n --url 'https://cloud.lambda.ai/api/v1/instance-operations/launch' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"region_name\": LAMBDA_REGION_NAME,\n \"instance_type_name\": LAMBDA_INSTANCE_TYPE_NAME,\n \"ssh_key_names\": [\"LAMBDA_SSH_KEY_NAME\"],\n \"name\": \"node-alpine-instance\",\n \"user_data\": \"#!/bin/bash\\napt-get update\\napt-get install -y docker.io\\nsystemctl start docker\\nsystemctl enable docker\\ndocker pull node:alpine\\ndocker run -d --name node-app node:alpine tail -f /dev/null\"\n }'\n *\n * Curl Command to list instances\n * curl --request GET \\\n --url 'https://cloud.lambda.ai/api/v1/instances' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY'\n *\n * Curl Command to getById()\n * curl --request GET \\\n --url 'https://cloud.lambda.ai/api/v1/instances/<INSTANCE-ID>' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY'\n *\n * Curl Command to Destroy Instance (terminate)\n * curl --request POST \\\n --url 'https://cloud.lambda.ai/api/v1/instance-operations/terminate' \\\n --header 'Authorization: Bearer LAMBDA_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"instance_ids\": [\"<YOUR-INSTANCE-ID>\"]\n }'\n */\n\nimport { createProvider } from 'computesdk';\nimport type { Runtime, CodeResult, CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions } from 'computesdk';\n\n/**\n * Lambda sandbox interface\n */\ninterface LambdaSandbox {\n instanceId: string;\n regionName: string;\n instanceTypeName: string;\n}\n\nexport interface LambdaConfig {\n /** Lambda API key - if not provided, will fallback to LAMBDA_API_KEY environment variable */\n apiKey?: string;\n /** Lambda Region Name - if not provided, will fallback to LAMBDA_REGION_NAME environment variable */\n regionName?: string;\n /** Lambda Instance Type Name - if not provided, will fallback to LAMBDA_INSTANCE_TYPE_NAME environment variable */\n instanceTypeName?: string;\n /** Lambda SSH Key Name - if not provided, will fallback to LAMBDA_SSH_KEY_NAME environment variable */\n sshKeyName?: string;\n}\n\nexport const getAndValidateCredentials = (config: LambdaConfig) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.LAMBDA_API_KEY) || '';\n const regionName = config.regionName || (typeof process !== 'undefined' && process.env?.LAMBDA_REGION_NAME) || '';\n const instanceTypeName = config.instanceTypeName || (typeof process !== 'undefined' && process.env?.LAMBDA_INSTANCE_TYPE_NAME) || '';\n const sshKeyName = config.sshKeyName || (typeof process !== 'undefined' && process.env?.LAMBDA_SSH_KEY_NAME) || '';\n\n if (!apiKey) {\n throw new Error(\n 'Missing Lambda API key. Provide apiKey in config or set LAMBDA_API_KEY environment variable.'\n );\n }\n\n if (!regionName) {\n throw new Error(\n 'Missing Lambda Region Name. Provide regionName in config or set LAMBDA_REGION_NAME environment variable.'\n );\n }\n\n if (!instanceTypeName) {\n throw new Error(\n 'Missing Lambda Instance Type Name. Provide instanceTypeName in config or set LAMBDA_INSTANCE_TYPE_NAME environment variable.'\n );\n }\n\n if (!sshKeyName) {\n throw new Error(\n 'Missing Lambda SSH Key Name. Provide sshKeyName in config or set LAMBDA_SSH_KEY_NAME environment variable.'\n );\n }\n\n return { apiKey, regionName, instanceTypeName, sshKeyName };\n};\n\nconst LAMBDA_API_ENDPOINTS = {\n LAUNCH_INSTANCE: 'https://cloud.lambda.ai/api/v1/instance-operations/launch',\n LIST_INSTANCES: 'https://cloud.lambda.ai/api/v1/instances',\n GET_INSTANCE: (instanceId: string) => `https://cloud.lambda.ai/api/v1/instances/${instanceId}`,\n TERMINATE_INSTANCES: 'https://cloud.lambda.ai/api/v1/instance-operations/terminate'\n};\n\nconst handleLambdaAPIError = (response: Response, data?: any) => {\n if (!response.ok) {\n let errorMessage;\n if (data?.error) {\n // Handle Lambda API error format: { \"error\": { \"code\": \"...\", \"message\": \"...\", \"suggestion\": \"...\" } }\n if (typeof data.error === 'object' && data.error.message) {\n errorMessage = `${data.error.message}${data.error.suggestion ? ` ${data.error.suggestion}` : ''} (${data.error.code || 'unknown'})`;\n } else {\n errorMessage = JSON.stringify(data.error);\n }\n } else {\n errorMessage = data?.message || `HTTP ${response.status} ${response.statusText}`;\n }\n throw new Error(`Lambda API error: ${errorMessage}`);\n }\n};\n\n\nexport const fetchLambda = async (\n apiKey: string,\n endpoint: string,\n options: {\n method?: string;\n body?: any;\n } = {}\n) => {\n const { method = 'GET', body } = options;\n \n const response = await fetch(endpoint, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n ...(body ? { body: JSON.stringify(body) } : {})\n });\n\n const data = await response.json();\n\n // Handle Lambda API errors\n handleLambdaAPIError(response, data);\n\n return data;\n};\n\n\n\n/**\n * Create a Lambda provider instance using the factory pattern\n */\nexport const lambda = createProvider<LambdaSandbox, LambdaConfig>({\n name: 'lambda',\n methods: {\n sandbox: {\n // Collection operations (compute.sandbox.*)\n create: async (config: LambdaConfig, options?: CreateSandboxOptions) => {\n const { apiKey, regionName, instanceTypeName, sshKeyName } = getAndValidateCredentials(config);\n\n try {\n const dockerImage = options?.runtime === 'node' ? 'node:alpine' : 'python:alpine';\n const userData = `#!/bin/bash\napt-get update\napt-get install -y docker.io\nsystemctl start docker\nsystemctl enable docker\ndocker pull ${dockerImage}\ndocker run -d --name compute-app ${dockerImage} tail -f /dev/null`;\n\n const launchBody = {\n region_name: regionName,\n instance_type_name: instanceTypeName,\n ssh_key_names: [sshKeyName],\n name: `compute-${options?.runtime || 'node'}-instance`,\n user_data: userData\n };\n\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.LAUNCH_INSTANCE, {\n method: 'POST',\n body: launchBody\n });\n \n // Lambda API returns instance_ids as an array\n const instanceIds = responseData?.data?.instance_ids;\n if (!instanceIds || !Array.isArray(instanceIds) || instanceIds.length === 0) {\n throw new Error(`No instance IDs returned from Lambda API. Full response: ${JSON.stringify(responseData)}`);\n }\n\n // Take the first instance ID (should only be one for single instance creation)\n const instanceId = instanceIds[0];\n\n const lambdaSandbox: LambdaSandbox = {\n instanceId,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n throw new Error(\n `Failed to create Lambda sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: LambdaConfig, sandboxId: string) => {\n const { apiKey, regionName, instanceTypeName } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.GET_INSTANCE(sandboxId));\n \n // Lambda API returns the instance directly in data (single instance, not array)\n const instance = responseData?.data;\n if (!instance) {\n return null;\n }\n \n if (!instance.id) {\n throw new Error('Instance data is missing ID from Lambda response');\n }\n\n const lambdaSandbox: LambdaSandbox = {\n instanceId: instance.id,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instance.id\n };\n } catch (error) {\n // Return null for 404s (instance not found)\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('Not Found'))) {\n return null;\n }\n throw new Error(\n `Failed to get Lambda sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: LambdaConfig) => {\n const { apiKey, regionName, instanceTypeName } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.LIST_INSTANCES);\n \n // Lambda API returns instances directly in data array\n const instances = responseData?.data || [];\n \n if (!Array.isArray(instances)) {\n throw new Error(`Expected instances array, got: ${typeof instances}`);\n }\n \n // Transform each instance into the expected format\n const sandboxes = instances.map((instance: any) => {\n const lambdaSandbox: LambdaSandbox = {\n instanceId: instance.id,\n regionName,\n instanceTypeName,\n };\n\n return {\n sandbox: lambdaSandbox,\n sandboxId: instance.id\n };\n });\n\n return sandboxes;\n } catch (error) {\n throw new Error(\n `Failed to list Lambda sandboxes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: LambdaConfig, sandboxId: string) => {\n const { apiKey } = getAndValidateCredentials(config);\n\n try {\n const terminateBody = {\n instance_ids: [sandboxId]\n };\n\n await fetchLambda(apiKey, LAMBDA_API_ENDPOINTS.TERMINATE_INSTANCES, {\n method: 'POST',\n body: terminateBody\n });\n } catch (error) {\n // For destroy operations, we typically don't throw if the instance is already gone\n console.warn(`Lambda destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n // Instance operations (minimal stubs - not implemented yet)\n runCode: async (_sandbox: LambdaSandbox, _code: string, _runtime?: Runtime) => {\n throw new Error('Lambda runCode method not implemented yet');\n },\n\n runCommand: async (_sandbox: LambdaSandbox, _command: string, _args?: string[], _options?: RunCommandOptions) => {\n throw new Error('Lambda runCommand method not implemented yet');\n },\n\n getInfo: async (_sandbox: LambdaSandbox) => {\n throw new Error('Lambda getInfo method not implemented yet');\n },\n\n getUrl: async (_sandbox: LambdaSandbox, _options: { port: number; protocol?: string }) => {\n throw new Error('Lambda getUrl method not implemented yet');\n },\n\n },\n },\n});\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@computesdk/lambda",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Lambda provider for ComputeSDK",
|
|
5
5
|
"author": "ComputeSDK Team",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"dist"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"computesdk": "1.
|
|
22
|
+
"computesdk": "1.9.1"
|
|
23
23
|
},
|
|
24
24
|
"keywords": [
|
|
25
25
|
"lambda",
|