@pipedream.in/cloud-compute-sdk
Version:
Official SDK for Pipedream Cloud Compute Platform
268 lines (258 loc) • 11.1 kB
JavaScript
"use strict";
/**
* SDK Client for Cloud Compute Platform
*
* Example usage:
*
* import { CloudComputeSDK } from './lib/sdkClient'
*
* const sdk = new CloudComputeSDK({
* baseUrl: 'https://your-project.supabase.co/functions/v1',
* apiKey: 'your-api-key'
* })
*
* // Check wallet balance
* const balance = await sdk.wallet.getBalance()
*
* // Create deployment
* const deployment = await sdk.deployments.create({
* cloud_inventory_id: 'uuid',
* rental_duration_hours: 24
* })
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.EXAMPLE_USAGE = exports.CloudComputeSDK = void 0;
class CloudComputeSDK {
constructor(config) {
// Cloud Providers Management
this.providers = {
list: async () => {
return this.request('/sdk-providers');
},
getRegions: async (providerId) => {
const searchParams = new URLSearchParams();
if (providerId)
searchParams.set('provider_id', providerId);
const endpoint = `/sdk-providers/regions${searchParams.toString() ? `?${searchParams}` : ''}`;
return this.request(endpoint);
},
getTemplates: async (providerId) => {
const searchParams = new URLSearchParams();
if (providerId)
searchParams.set('provider_id', providerId);
const endpoint = `/sdk-providers/templates${searchParams.toString() ? `?${searchParams}` : ''}`;
return this.request(endpoint);
},
};
// Cloud Inventory Management
this.inventory = {
list: async (params) => {
const searchParams = new URLSearchParams();
if (params?.provider_id)
searchParams.set('provider_id', params.provider_id);
if (params?.region_id)
searchParams.set('region_id', params.region_id);
if (params?.instance_type)
searchParams.set('instance_type', params.instance_type);
if (params?.min_vcpu)
searchParams.set('min_vcpu', params.min_vcpu.toString());
if (params?.max_price_usd_hr)
searchParams.set('max_price_usd_hr', params.max_price_usd_hr.toString());
if (params?.accel_model)
searchParams.set('accel_model', params.accel_model);
if (params?.availability_type)
searchParams.set('availability_type', params.availability_type);
if (params?.limit)
searchParams.set('limit', params.limit.toString());
if (params?.offset)
searchParams.set('offset', params.offset.toString());
const endpoint = `/sdk-inventory${searchParams.toString() ? `?${searchParams}` : ''}`;
return this.request(endpoint);
},
get: async (inventoryId) => {
return this.request(`/sdk-inventory/${inventoryId}`);
},
getByProvider: async (providerName, params) => {
const searchParams = new URLSearchParams();
searchParams.set('provider', providerName);
if (params?.region_code)
searchParams.set('region_code', params.region_code);
if (params?.instance_type)
searchParams.set('instance_type', params.instance_type);
if (params?.min_vcpu)
searchParams.set('min_vcpu', params.min_vcpu.toString());
if (params?.max_price_usd_hr)
searchParams.set('max_price_usd_hr', params.max_price_usd_hr.toString());
if (params?.limit)
searchParams.set('limit', params.limit.toString());
if (params?.offset)
searchParams.set('offset', params.offset.toString());
const endpoint = `/sdk-inventory/provider/${providerName}${searchParams.toString() ? `?${searchParams}` : ''}`;
return this.request(endpoint);
},
};
// Deployment Management
this.deployments = {
create: async (params) => {
return this.request('/sdk-deployments', {
method: 'POST',
body: JSON.stringify(params),
});
},
list: async (params) => {
const searchParams = new URLSearchParams();
if (params?.limit)
searchParams.set('limit', params.limit.toString());
if (params?.offset)
searchParams.set('offset', params.offset.toString());
if (params?.status)
searchParams.set('status', params.status);
const endpoint = `/sdk-deployments${searchParams.toString() ? `?${searchParams}` : ''}`;
return this.request(endpoint);
},
get: async (deploymentId) => {
return this.request(`/sdk-deployments/${deploymentId}`);
},
};
// Usage Tracking
this.usage = {
getLogs: async (params) => {
const searchParams = new URLSearchParams();
if (params?.limit)
searchParams.set('limit', params.limit.toString());
if (params?.offset)
searchParams.set('offset', params.offset.toString());
if (params?.start_date)
searchParams.set('start_date', params.start_date);
if (params?.end_date)
searchParams.set('end_date', params.end_date);
if (params?.endpoint)
searchParams.set('endpoint', params.endpoint);
const endpoint = `/sdk-usage-tracking/logs${searchParams.toString() ? `?${searchParams}` : ''}`;
return this.request(endpoint);
},
getSummary: async (params) => {
const searchParams = new URLSearchParams();
if (params?.start_date)
searchParams.set('start_date', params.start_date);
if (params?.end_date)
searchParams.set('end_date', params.end_date);
const endpoint = `/sdk-usage-tracking/summary${searchParams.toString() ? `?${searchParams}` : ''}`;
return this.request(endpoint);
},
getBilling: async (params) => {
const searchParams = new URLSearchParams();
if (params?.start_date)
searchParams.set('start_date', params.start_date);
if (params?.end_date)
searchParams.set('end_date', params.end_date);
const endpoint = `/sdk-usage-tracking/billing${searchParams.toString() ? `?${searchParams}` : ''}`;
return this.request(endpoint);
},
};
this.baseUrl = config.baseUrl.replace(/\/$/, '');
this.apiKey = config.apiKey;
}
async request(endpoint, options = {}) {
const url = `${this.baseUrl}${endpoint}`;
const response = await fetch(url, {
...options,
headers: {
'Content-Type': 'application/json',
'x-api-key': this.apiKey,
...options.headers,
},
});
// Parse body once, fall back gracefully if JSON parsing fails.
let parsed;
try {
parsed = await response.json();
}
catch (_) {
parsed = { error: 'Failed to parse response body as JSON' };
}
if (!response.ok) {
// Narrow to extract an error message if present.
let message = `HTTP ${response.status}`;
if (typeof parsed === 'object' &&
parsed !== null &&
'error' in parsed &&
typeof parsed.error === 'string') {
message = parsed.error;
}
throw new Error(message);
}
return parsed;
}
}
exports.CloudComputeSDK = CloudComputeSDK;
// Example usage documentation
exports.EXAMPLE_USAGE = `
// Initialize the SDK
const sdk = new CloudComputeSDK({
baseUrl: 'https://iblofngyjjxyafjayxkt.supabase.co/functions/v1',
apiKey: 'your-api-key-here'
})
// List all available cloud providers
const providers = await sdk.providers.list()
console.log('Available providers:', providers.data)
// Get regions for AWS
const awsRegions = await sdk.providers.getRegions('aws-provider-id')
console.log('AWS regions:', awsRegions.data)
// Get templates for AWS
const awsTemplates = await sdk.providers.getTemplates('aws-provider-id')
console.log('AWS templates:', awsTemplates.data)
// List all inventory
const allInventory = await sdk.inventory.list()
console.log('All available machines:', allInventory.data)
// Filter AWS machines by region and specs
const awsMachines = await sdk.inventory.getByProvider('aws', {
region_code: 'us-east-1',
min_vcpu: 4,
max_price_usd_hr: 1.0
})
console.log('Filtered AWS machines:', awsMachines.data)
// Get specific inventory details
const machineDetails = await sdk.inventory.get('inventory-id')
console.log('Machine details:', machineDetails.data)
// Create a deployment
const deployment = await sdk.deployments.create({
cloud_inventory_id: 'your-inventory-id',
rental_duration_hours: 24,
ssh_public_key: 'ssh-rsa AAAAB3...'
})
// Get usage summary
const usage = await sdk.usage.getSummary({
start_date: '2025-01-01T00:00:00Z',
end_date: '2025-01-31T23:59:59Z'
})
// INVENTORY STRUCTURE EXPLANATION:
//
// 1. PROVIDERS: Each provider (AWS, Vultr, VAST AI) has different machine types
// - AWS: EC2 instances (t3.micro, m5.large, g4dn.xlarge, etc.)
// - Vultr: VPS instances (vc2-1c-1gb, vcg-g1-1c-3gb, etc.)
// - VAST AI: GPU instances (RTX 4090, A100, H100, etc.)
//
// 2. REGIONS: Each provider has different regions
// - AWS: us-east-1, eu-west-1, ap-southeast-1, etc.
// - Vultr: ewr, lax, fra, etc.
// - VAST AI: Global locations
//
// 3. TEMPLATES: Each provider has deployment templates
// - AWS: AMI images (Ubuntu 20.04, Windows Server, Deep Learning AMI)
// - Vultr: OS templates (Ubuntu, CentOS, Debian, etc.)
// - VAST AI: Docker images for ML/AI workloads
//
// 4. INVENTORY FILTERING:
// - By provider: Filter machines by specific cloud provider
// - By region: Filter by geographical location
// - By specs: Filter by CPU cores, memory, GPU, price
// - By availability: instant, on-demand, spot instances
//
// Example workflow:
// 1. List providers → Choose AWS/Vultr/VAST
// 2. Get regions for chosen provider → Select region
// 3. Get templates for provider → Choose OS/Docker image
// 4. List inventory with filters → Find suitable machine
// 5. Create deployment with inventory_id + template
`;