@computesdk/namespace 1.1.8 → 1.1.10
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 +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -195,7 +195,7 @@ var namespace = (0, import_provider.defineProvider)({
|
|
|
195
195
|
runCode: async (_sandbox, _code, _runtime) => {
|
|
196
196
|
throw new Error("Namespace runCode method not implemented yet");
|
|
197
197
|
},
|
|
198
|
-
runCommand: async (_sandbox, _command,
|
|
198
|
+
runCommand: async (_sandbox, _command, _options) => {
|
|
199
199
|
throw new Error("Namespace runCommand method not implemented yet");
|
|
200
200
|
},
|
|
201
201
|
getInfo: async (_sandbox) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Namespace Provider - Factory-based Implementation\n */\n\nimport { defineProvider } from '@computesdk/provider';\n\nimport type { Runtime, CodeResult, CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions } from '@computesdk/provider';\n\n/**\n * Namespace sandbox interface\n */\ninterface NamespaceSandbox {\n instanceId: string;\n name: string;\n}\n\nexport interface NamespaceConfig {\n /** Namespace API token - if not provided, will fallback to NSC_TOKEN environment variable */\n token?: string;\n /** Virtual CPU cores for the instance */\n virtualCpu?: number;\n /** Memory in megabytes for the instance */\n memoryMegabytes?: number;\n /** Machine architecture (default: amd64) */\n machineArch?: string;\n /** Operating system (default: linux) */\n os?: string;\n /** Documented purpose for the instance */\n documentedPurpose?: string;\n /** Reason for destroying instances (default: \"ComputeSDK cleanup\") */\n destroyReason?: string;\n}\n\nexport const getAndValidateCredentials = (config: NamespaceConfig) => {\n const token = config.token || (typeof process !== 'undefined' && process.env?.NSC_TOKEN) || '';\n\n if (!token) {\n throw new Error(\n 'Missing Namespace token. Provide token in config or set NSC_TOKEN environment variable.'\n );\n }\n\n return { token };\n};\n\nconst API_ENDPOINTS = {\n CREATE_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/CreateInstance',\n DESCRIBE_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/DescribeInstance',\n LIST_INSTANCES: '/namespace.cloud.compute.v1beta.ComputeService/ListInstances',\n DESTROY_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/DestroyInstance'\n};\n\nconst handleApiErrors = (response: any) => {\n if (response.error) {\n throw new Error(`Namespace API error: ${response.error}`);\n }\n};\n\nexport const fetchNamespace = async (\n token: string, \n endpoint: string,\n options: RequestInit = {}\n) => {\n \n const response = await fetch(`https://us.compute.namespaceapis.com${endpoint}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n ...options.headers\n }\n });\n\n if (!response.ok) {\n throw new Error(`Namespace API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Standard error handling for all operations\n handleApiErrors(data);\n\n return data;\n};\n\n/**\n * Create a Namespace provider instance using the factory pattern\n */\nexport const namespace = defineProvider<NamespaceSandbox, NamespaceConfig>({\n name: 'namespace',\n methods: {\n sandbox: {\n // Collection operations (compute.sandbox.*)\n create: async (config: NamespaceConfig, options?: CreateSandboxOptions) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n // Get image based on runtime\n const getImageRef = (runtime?: Runtime) => {\n return runtime === 'node' ? 'node:alpine' : 'python:alpine';\n };\n\n const requestBody = {\n shape: {\n virtual_cpu: config.virtualCpu || 2,\n memory_megabytes: config.memoryMegabytes || 4096,\n machine_arch: config.machineArch || 'amd64',\n os: config.os || 'linux'\n },\n containers: [{\n name: 'main-container',\n image_ref: getImageRef(options?.runtime),\n args: ['sleep', '300']\n }],\n documented_purpose: config.documentedPurpose || 'ComputeSDK sandbox'\n };\n\n const responseData = await fetchNamespace(token, API_ENDPOINTS.CREATE_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n // Extract instance ID from the Namespace API response structure\n if (!responseData.metadata?.instanceId) {\n throw new Error(`Instance ID is undefined. Full response object: ${JSON.stringify(responseData, null, 2)}`);\n }\n\n const instanceId = responseData.metadata.instanceId;\n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n throw new Error(\n `Failed to create Namespace instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: NamespaceConfig, sandboxId: string) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const requestBody = {\n instance_id: sandboxId\n };\n\n const responseData = await fetchNamespace(token, API_ENDPOINTS.DESCRIBE_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n // Extract instance ID from the Namespace API response structure\n if (!responseData.metadata?.instanceId) {\n throw new Error('Instance data is missing from Namespace response');\n }\n\n const instanceId = responseData.metadata.instanceId;\n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n // Handle 404 errors by returning null (instance not found)\n if (error instanceof Error && error.message.includes('404 Not Found')) {\n return null;\n }\n \n throw new Error(\n `Failed to get Namespace instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: NamespaceConfig) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchNamespace(token, API_ENDPOINTS.LIST_INSTANCES, {\n method: 'POST',\n body: JSON.stringify({})\n });\n \n // Extract instances from the response\n const instances = responseData?.instances || [];\n \n // Transform each instance into the expected format\n const namespaceSandboxes = instances.map((instanceData: any) => {\n // For list response, instanceId is directly in the instance object, not in metadata\n const instanceId = instanceData.instanceId || instanceData.metadata?.instanceId;\n if (!instanceId) {\n console.warn('Instance missing instanceId:', instanceData);\n return null;\n }\n \n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n }).filter(Boolean); // Remove any null entries\n\n return namespaceSandboxes;\n } catch (error) {\n throw new Error(\n `Failed to list Namespace instances: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: NamespaceConfig, sandboxId: string) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const requestBody = {\n instance_id: sandboxId,\n reason: config.destroyReason || \"ComputeSDK cleanup\"\n };\n\n const data = await fetchNamespace(token, API_ENDPOINTS.DESTROY_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n if (data.error) {\n // Log errors but don't throw for destroy operations\n console.warn(`Namespace destroy warning: ${data.error}`);\n }\n } catch (error) {\n // For destroy operations, we typically don't throw if the instance is already gone\n console.warn(`Namespace destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n // Instance operations (minimal stubs - not implemented yet)\n runCode: async (_sandbox: NamespaceSandbox, _code: string, _runtime?: Runtime) => {\n throw new Error('Namespace runCode method not implemented yet');\n },\n\n runCommand: async (_sandbox: NamespaceSandbox, _command: string, _args?: string[], _options?: RunCommandOptions) => {\n throw new Error('Namespace runCommand method not implemented yet');\n },\n\n getInfo: async (_sandbox: NamespaceSandbox) => {\n throw new Error('Namespace getInfo method not implemented yet');\n },\n\n getUrl: async (_sandbox: NamespaceSandbox, _options: { port: number; protocol?: string }) => {\n throw new Error('Namespace 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 * Namespace Provider - Factory-based Implementation\n */\n\nimport { defineProvider } from '@computesdk/provider';\n\nimport type { Runtime, CodeResult, CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions } from '@computesdk/provider';\n\n/**\n * Namespace sandbox interface\n */\ninterface NamespaceSandbox {\n instanceId: string;\n name: string;\n}\n\nexport interface NamespaceConfig {\n /** Namespace API token - if not provided, will fallback to NSC_TOKEN environment variable */\n token?: string;\n /** Virtual CPU cores for the instance */\n virtualCpu?: number;\n /** Memory in megabytes for the instance */\n memoryMegabytes?: number;\n /** Machine architecture (default: amd64) */\n machineArch?: string;\n /** Operating system (default: linux) */\n os?: string;\n /** Documented purpose for the instance */\n documentedPurpose?: string;\n /** Reason for destroying instances (default: \"ComputeSDK cleanup\") */\n destroyReason?: string;\n}\n\nexport const getAndValidateCredentials = (config: NamespaceConfig) => {\n const token = config.token || (typeof process !== 'undefined' && process.env?.NSC_TOKEN) || '';\n\n if (!token) {\n throw new Error(\n 'Missing Namespace token. Provide token in config or set NSC_TOKEN environment variable.'\n );\n }\n\n return { token };\n};\n\nconst API_ENDPOINTS = {\n CREATE_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/CreateInstance',\n DESCRIBE_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/DescribeInstance',\n LIST_INSTANCES: '/namespace.cloud.compute.v1beta.ComputeService/ListInstances',\n DESTROY_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/DestroyInstance'\n};\n\nconst handleApiErrors = (response: any) => {\n if (response.error) {\n throw new Error(`Namespace API error: ${response.error}`);\n }\n};\n\nexport const fetchNamespace = async (\n token: string, \n endpoint: string,\n options: RequestInit = {}\n) => {\n \n const response = await fetch(`https://us.compute.namespaceapis.com${endpoint}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n ...options.headers\n }\n });\n\n if (!response.ok) {\n throw new Error(`Namespace API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Standard error handling for all operations\n handleApiErrors(data);\n\n return data;\n};\n\n/**\n * Create a Namespace provider instance using the factory pattern\n */\nexport const namespace = defineProvider<NamespaceSandbox, NamespaceConfig>({\n name: 'namespace',\n methods: {\n sandbox: {\n // Collection operations (compute.sandbox.*)\n create: async (config: NamespaceConfig, options?: CreateSandboxOptions) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n // Get image based on runtime\n const getImageRef = (runtime?: Runtime) => {\n return runtime === 'node' ? 'node:alpine' : 'python:alpine';\n };\n\n const requestBody = {\n shape: {\n virtual_cpu: config.virtualCpu || 2,\n memory_megabytes: config.memoryMegabytes || 4096,\n machine_arch: config.machineArch || 'amd64',\n os: config.os || 'linux'\n },\n containers: [{\n name: 'main-container',\n image_ref: getImageRef(options?.runtime),\n args: ['sleep', '300']\n }],\n documented_purpose: config.documentedPurpose || 'ComputeSDK sandbox'\n };\n\n const responseData = await fetchNamespace(token, API_ENDPOINTS.CREATE_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n // Extract instance ID from the Namespace API response structure\n if (!responseData.metadata?.instanceId) {\n throw new Error(`Instance ID is undefined. Full response object: ${JSON.stringify(responseData, null, 2)}`);\n }\n\n const instanceId = responseData.metadata.instanceId;\n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n throw new Error(\n `Failed to create Namespace instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: NamespaceConfig, sandboxId: string) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const requestBody = {\n instance_id: sandboxId\n };\n\n const responseData = await fetchNamespace(token, API_ENDPOINTS.DESCRIBE_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n // Extract instance ID from the Namespace API response structure\n if (!responseData.metadata?.instanceId) {\n throw new Error('Instance data is missing from Namespace response');\n }\n\n const instanceId = responseData.metadata.instanceId;\n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n // Handle 404 errors by returning null (instance not found)\n if (error instanceof Error && error.message.includes('404 Not Found')) {\n return null;\n }\n \n throw new Error(\n `Failed to get Namespace instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: NamespaceConfig) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchNamespace(token, API_ENDPOINTS.LIST_INSTANCES, {\n method: 'POST',\n body: JSON.stringify({})\n });\n \n // Extract instances from the response\n const instances = responseData?.instances || [];\n \n // Transform each instance into the expected format\n const namespaceSandboxes = instances.map((instanceData: any) => {\n // For list response, instanceId is directly in the instance object, not in metadata\n const instanceId = instanceData.instanceId || instanceData.metadata?.instanceId;\n if (!instanceId) {\n console.warn('Instance missing instanceId:', instanceData);\n return null;\n }\n \n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n }).filter(Boolean); // Remove any null entries\n\n return namespaceSandboxes;\n } catch (error) {\n throw new Error(\n `Failed to list Namespace instances: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: NamespaceConfig, sandboxId: string) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const requestBody = {\n instance_id: sandboxId,\n reason: config.destroyReason || \"ComputeSDK cleanup\"\n };\n\n const data = await fetchNamespace(token, API_ENDPOINTS.DESTROY_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n if (data.error) {\n // Log errors but don't throw for destroy operations\n console.warn(`Namespace destroy warning: ${data.error}`);\n }\n } catch (error) {\n // For destroy operations, we typically don't throw if the instance is already gone\n console.warn(`Namespace destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n // Instance operations (minimal stubs - not implemented yet)\n runCode: async (_sandbox: NamespaceSandbox, _code: string, _runtime?: Runtime) => {\n throw new Error('Namespace runCode method not implemented yet');\n },\n\n runCommand: async (_sandbox: NamespaceSandbox, _command: string, _options?: RunCommandOptions) => {\n throw new Error('Namespace runCommand method not implemented yet');\n },\n\n getInfo: async (_sandbox: NamespaceSandbox) => {\n throw new Error('Namespace getInfo method not implemented yet');\n },\n\n getUrl: async (_sandbox: NamespaceSandbox, _options: { port: number; protocol?: string }) => {\n throw new Error('Namespace getUrl method not implemented yet');\n },\n\n },\n },\n});\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -169,7 +169,7 @@ var namespace = defineProvider({
|
|
|
169
169
|
runCode: async (_sandbox, _code, _runtime) => {
|
|
170
170
|
throw new Error("Namespace runCode method not implemented yet");
|
|
171
171
|
},
|
|
172
|
-
runCommand: async (_sandbox, _command,
|
|
172
|
+
runCommand: async (_sandbox, _command, _options) => {
|
|
173
173
|
throw new Error("Namespace runCommand method not implemented yet");
|
|
174
174
|
},
|
|
175
175
|
getInfo: async (_sandbox) => {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Namespace Provider - Factory-based Implementation\n */\n\nimport { defineProvider } from '@computesdk/provider';\n\nimport type { Runtime, CodeResult, CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions } from '@computesdk/provider';\n\n/**\n * Namespace sandbox interface\n */\ninterface NamespaceSandbox {\n instanceId: string;\n name: string;\n}\n\nexport interface NamespaceConfig {\n /** Namespace API token - if not provided, will fallback to NSC_TOKEN environment variable */\n token?: string;\n /** Virtual CPU cores for the instance */\n virtualCpu?: number;\n /** Memory in megabytes for the instance */\n memoryMegabytes?: number;\n /** Machine architecture (default: amd64) */\n machineArch?: string;\n /** Operating system (default: linux) */\n os?: string;\n /** Documented purpose for the instance */\n documentedPurpose?: string;\n /** Reason for destroying instances (default: \"ComputeSDK cleanup\") */\n destroyReason?: string;\n}\n\nexport const getAndValidateCredentials = (config: NamespaceConfig) => {\n const token = config.token || (typeof process !== 'undefined' && process.env?.NSC_TOKEN) || '';\n\n if (!token) {\n throw new Error(\n 'Missing Namespace token. Provide token in config or set NSC_TOKEN environment variable.'\n );\n }\n\n return { token };\n};\n\nconst API_ENDPOINTS = {\n CREATE_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/CreateInstance',\n DESCRIBE_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/DescribeInstance',\n LIST_INSTANCES: '/namespace.cloud.compute.v1beta.ComputeService/ListInstances',\n DESTROY_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/DestroyInstance'\n};\n\nconst handleApiErrors = (response: any) => {\n if (response.error) {\n throw new Error(`Namespace API error: ${response.error}`);\n }\n};\n\nexport const fetchNamespace = async (\n token: string, \n endpoint: string,\n options: RequestInit = {}\n) => {\n \n const response = await fetch(`https://us.compute.namespaceapis.com${endpoint}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n ...options.headers\n }\n });\n\n if (!response.ok) {\n throw new Error(`Namespace API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Standard error handling for all operations\n handleApiErrors(data);\n\n return data;\n};\n\n/**\n * Create a Namespace provider instance using the factory pattern\n */\nexport const namespace = defineProvider<NamespaceSandbox, NamespaceConfig>({\n name: 'namespace',\n methods: {\n sandbox: {\n // Collection operations (compute.sandbox.*)\n create: async (config: NamespaceConfig, options?: CreateSandboxOptions) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n // Get image based on runtime\n const getImageRef = (runtime?: Runtime) => {\n return runtime === 'node' ? 'node:alpine' : 'python:alpine';\n };\n\n const requestBody = {\n shape: {\n virtual_cpu: config.virtualCpu || 2,\n memory_megabytes: config.memoryMegabytes || 4096,\n machine_arch: config.machineArch || 'amd64',\n os: config.os || 'linux'\n },\n containers: [{\n name: 'main-container',\n image_ref: getImageRef(options?.runtime),\n args: ['sleep', '300']\n }],\n documented_purpose: config.documentedPurpose || 'ComputeSDK sandbox'\n };\n\n const responseData = await fetchNamespace(token, API_ENDPOINTS.CREATE_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n // Extract instance ID from the Namespace API response structure\n if (!responseData.metadata?.instanceId) {\n throw new Error(`Instance ID is undefined. Full response object: ${JSON.stringify(responseData, null, 2)}`);\n }\n\n const instanceId = responseData.metadata.instanceId;\n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n throw new Error(\n `Failed to create Namespace instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: NamespaceConfig, sandboxId: string) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const requestBody = {\n instance_id: sandboxId\n };\n\n const responseData = await fetchNamespace(token, API_ENDPOINTS.DESCRIBE_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n // Extract instance ID from the Namespace API response structure\n if (!responseData.metadata?.instanceId) {\n throw new Error('Instance data is missing from Namespace response');\n }\n\n const instanceId = responseData.metadata.instanceId;\n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n // Handle 404 errors by returning null (instance not found)\n if (error instanceof Error && error.message.includes('404 Not Found')) {\n return null;\n }\n \n throw new Error(\n `Failed to get Namespace instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: NamespaceConfig) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchNamespace(token, API_ENDPOINTS.LIST_INSTANCES, {\n method: 'POST',\n body: JSON.stringify({})\n });\n \n // Extract instances from the response\n const instances = responseData?.instances || [];\n \n // Transform each instance into the expected format\n const namespaceSandboxes = instances.map((instanceData: any) => {\n // For list response, instanceId is directly in the instance object, not in metadata\n const instanceId = instanceData.instanceId || instanceData.metadata?.instanceId;\n if (!instanceId) {\n console.warn('Instance missing instanceId:', instanceData);\n return null;\n }\n \n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n }).filter(Boolean); // Remove any null entries\n\n return namespaceSandboxes;\n } catch (error) {\n throw new Error(\n `Failed to list Namespace instances: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: NamespaceConfig, sandboxId: string) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const requestBody = {\n instance_id: sandboxId,\n reason: config.destroyReason || \"ComputeSDK cleanup\"\n };\n\n const data = await fetchNamespace(token, API_ENDPOINTS.DESTROY_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n if (data.error) {\n // Log errors but don't throw for destroy operations\n console.warn(`Namespace destroy warning: ${data.error}`);\n }\n } catch (error) {\n // For destroy operations, we typically don't throw if the instance is already gone\n console.warn(`Namespace destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n // Instance operations (minimal stubs - not implemented yet)\n runCode: async (_sandbox: NamespaceSandbox, _code: string, _runtime?: Runtime) => {\n throw new Error('Namespace runCode method not implemented yet');\n },\n\n runCommand: async (_sandbox: NamespaceSandbox, _command: string, _args?: string[], _options?: RunCommandOptions) => {\n throw new Error('Namespace runCommand method not implemented yet');\n },\n\n getInfo: async (_sandbox: NamespaceSandbox) => {\n throw new Error('Namespace getInfo method not implemented yet');\n },\n\n getUrl: async (_sandbox: NamespaceSandbox, _options: { port: number; protocol?: string }) => {\n throw new Error('Namespace 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 * Namespace Provider - Factory-based Implementation\n */\n\nimport { defineProvider } from '@computesdk/provider';\n\nimport type { Runtime, CodeResult, CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions } from '@computesdk/provider';\n\n/**\n * Namespace sandbox interface\n */\ninterface NamespaceSandbox {\n instanceId: string;\n name: string;\n}\n\nexport interface NamespaceConfig {\n /** Namespace API token - if not provided, will fallback to NSC_TOKEN environment variable */\n token?: string;\n /** Virtual CPU cores for the instance */\n virtualCpu?: number;\n /** Memory in megabytes for the instance */\n memoryMegabytes?: number;\n /** Machine architecture (default: amd64) */\n machineArch?: string;\n /** Operating system (default: linux) */\n os?: string;\n /** Documented purpose for the instance */\n documentedPurpose?: string;\n /** Reason for destroying instances (default: \"ComputeSDK cleanup\") */\n destroyReason?: string;\n}\n\nexport const getAndValidateCredentials = (config: NamespaceConfig) => {\n const token = config.token || (typeof process !== 'undefined' && process.env?.NSC_TOKEN) || '';\n\n if (!token) {\n throw new Error(\n 'Missing Namespace token. Provide token in config or set NSC_TOKEN environment variable.'\n );\n }\n\n return { token };\n};\n\nconst API_ENDPOINTS = {\n CREATE_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/CreateInstance',\n DESCRIBE_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/DescribeInstance',\n LIST_INSTANCES: '/namespace.cloud.compute.v1beta.ComputeService/ListInstances',\n DESTROY_INSTANCE: '/namespace.cloud.compute.v1beta.ComputeService/DestroyInstance'\n};\n\nconst handleApiErrors = (response: any) => {\n if (response.error) {\n throw new Error(`Namespace API error: ${response.error}`);\n }\n};\n\nexport const fetchNamespace = async (\n token: string, \n endpoint: string,\n options: RequestInit = {}\n) => {\n \n const response = await fetch(`https://us.compute.namespaceapis.com${endpoint}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n ...options.headers\n }\n });\n\n if (!response.ok) {\n throw new Error(`Namespace API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Standard error handling for all operations\n handleApiErrors(data);\n\n return data;\n};\n\n/**\n * Create a Namespace provider instance using the factory pattern\n */\nexport const namespace = defineProvider<NamespaceSandbox, NamespaceConfig>({\n name: 'namespace',\n methods: {\n sandbox: {\n // Collection operations (compute.sandbox.*)\n create: async (config: NamespaceConfig, options?: CreateSandboxOptions) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n // Get image based on runtime\n const getImageRef = (runtime?: Runtime) => {\n return runtime === 'node' ? 'node:alpine' : 'python:alpine';\n };\n\n const requestBody = {\n shape: {\n virtual_cpu: config.virtualCpu || 2,\n memory_megabytes: config.memoryMegabytes || 4096,\n machine_arch: config.machineArch || 'amd64',\n os: config.os || 'linux'\n },\n containers: [{\n name: 'main-container',\n image_ref: getImageRef(options?.runtime),\n args: ['sleep', '300']\n }],\n documented_purpose: config.documentedPurpose || 'ComputeSDK sandbox'\n };\n\n const responseData = await fetchNamespace(token, API_ENDPOINTS.CREATE_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n // Extract instance ID from the Namespace API response structure\n if (!responseData.metadata?.instanceId) {\n throw new Error(`Instance ID is undefined. Full response object: ${JSON.stringify(responseData, null, 2)}`);\n }\n\n const instanceId = responseData.metadata.instanceId;\n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n throw new Error(\n `Failed to create Namespace instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: NamespaceConfig, sandboxId: string) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const requestBody = {\n instance_id: sandboxId\n };\n\n const responseData = await fetchNamespace(token, API_ENDPOINTS.DESCRIBE_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n // Extract instance ID from the Namespace API response structure\n if (!responseData.metadata?.instanceId) {\n throw new Error('Instance data is missing from Namespace response');\n }\n\n const instanceId = responseData.metadata.instanceId;\n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n } catch (error) {\n // Handle 404 errors by returning null (instance not found)\n if (error instanceof Error && error.message.includes('404 Not Found')) {\n return null;\n }\n \n throw new Error(\n `Failed to get Namespace instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: NamespaceConfig) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchNamespace(token, API_ENDPOINTS.LIST_INSTANCES, {\n method: 'POST',\n body: JSON.stringify({})\n });\n \n // Extract instances from the response\n const instances = responseData?.instances || [];\n \n // Transform each instance into the expected format\n const namespaceSandboxes = instances.map((instanceData: any) => {\n // For list response, instanceId is directly in the instance object, not in metadata\n const instanceId = instanceData.instanceId || instanceData.metadata?.instanceId;\n if (!instanceId) {\n console.warn('Instance missing instanceId:', instanceData);\n return null;\n }\n \n const instanceName = `instance-${instanceId}`;\n\n const namespaceSandbox: NamespaceSandbox = {\n instanceId,\n name: instanceName,\n };\n\n return {\n sandbox: namespaceSandbox,\n sandboxId: instanceId\n };\n }).filter(Boolean); // Remove any null entries\n\n return namespaceSandboxes;\n } catch (error) {\n throw new Error(\n `Failed to list Namespace instances: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: NamespaceConfig, sandboxId: string) => {\n const { token } = getAndValidateCredentials(config);\n\n try {\n const requestBody = {\n instance_id: sandboxId,\n reason: config.destroyReason || \"ComputeSDK cleanup\"\n };\n\n const data = await fetchNamespace(token, API_ENDPOINTS.DESTROY_INSTANCE, {\n method: 'POST',\n body: JSON.stringify(requestBody)\n });\n \n if (data.error) {\n // Log errors but don't throw for destroy operations\n console.warn(`Namespace destroy warning: ${data.error}`);\n }\n } catch (error) {\n // For destroy operations, we typically don't throw if the instance is already gone\n console.warn(`Namespace destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n // Instance operations (minimal stubs - not implemented yet)\n runCode: async (_sandbox: NamespaceSandbox, _code: string, _runtime?: Runtime) => {\n throw new Error('Namespace runCode method not implemented yet');\n },\n\n runCommand: async (_sandbox: NamespaceSandbox, _command: string, _options?: RunCommandOptions) => {\n throw new Error('Namespace runCommand method not implemented yet');\n },\n\n getInfo: async (_sandbox: NamespaceSandbox) => {\n throw new Error('Namespace getInfo method not implemented yet');\n },\n\n getUrl: async (_sandbox: NamespaceSandbox, _options: { port: number; protocol?: string }) => {\n throw new Error('Namespace 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/namespace",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.10",
|
|
4
4
|
"description": "Namespace provider for ComputeSDK - cloud-native sandboxes with optional GPU support",
|
|
5
5
|
"author": "ComputeSDK Team",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@computesdk/provider": "1.0.
|
|
22
|
-
"computesdk": "1.10.
|
|
21
|
+
"@computesdk/provider": "1.0.4",
|
|
22
|
+
"computesdk": "1.10.3"
|
|
23
23
|
},
|
|
24
24
|
"keywords": [
|
|
25
25
|
"computesdk",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"tsup": "^8.0.0",
|
|
51
51
|
"typescript": "^5.0.0",
|
|
52
52
|
"vitest": "^1.0.0",
|
|
53
|
-
"@computesdk/test-utils": "1.5.
|
|
53
|
+
"@computesdk/test-utils": "1.5.1"
|
|
54
54
|
},
|
|
55
55
|
"scripts": {
|
|
56
56
|
"build": "tsup",
|