@computesdk/gateway 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -33,4 +33,33 @@ interface RailwayConfig {
33
33
  */
34
34
  declare const railway: (providerConfig: RailwayConfig) => _computesdk_provider.InfraProvider<RailwayInstance>;
35
35
 
36
- export { type RailwayConfig, type RailwayInstance, railway };
36
+ /**
37
+ * Render Infrastructure Provider
38
+ *
39
+ * Provides infrastructure-only methods for creating/destroying Render services.
40
+ * Used by the gateway server to provision compute resources with daemon pre-installed.
41
+ */
42
+ /**
43
+ * Render service instance
44
+ */
45
+ interface RenderInstance {
46
+ serviceId: string;
47
+ ownerId: string;
48
+ }
49
+ /**
50
+ * Render provider configuration
51
+ */
52
+ interface RenderConfig {
53
+ /** Render API key - if not provided, will fallback to RENDER_API_KEY environment variable */
54
+ apiKey?: string;
55
+ /** Render Owner ID - if not provided, will fallback to RENDER_OWNER_ID environment variable */
56
+ ownerId?: string;
57
+ }
58
+ /**
59
+ * Render infrastructure provider
60
+ *
61
+ * Creates Render services with ComputeSDK daemon pre-installed via Docker image.
62
+ */
63
+ declare const render: (providerConfig: RenderConfig) => _computesdk_provider.InfraProvider<RenderInstance>;
64
+
65
+ export { type RailwayConfig, type RailwayInstance, type RenderConfig, type RenderInstance, railway, render };
package/dist/index.d.ts CHANGED
@@ -33,4 +33,33 @@ interface RailwayConfig {
33
33
  */
34
34
  declare const railway: (providerConfig: RailwayConfig) => _computesdk_provider.InfraProvider<RailwayInstance>;
35
35
 
36
- export { type RailwayConfig, type RailwayInstance, railway };
36
+ /**
37
+ * Render Infrastructure Provider
38
+ *
39
+ * Provides infrastructure-only methods for creating/destroying Render services.
40
+ * Used by the gateway server to provision compute resources with daemon pre-installed.
41
+ */
42
+ /**
43
+ * Render service instance
44
+ */
45
+ interface RenderInstance {
46
+ serviceId: string;
47
+ ownerId: string;
48
+ }
49
+ /**
50
+ * Render provider configuration
51
+ */
52
+ interface RenderConfig {
53
+ /** Render API key - if not provided, will fallback to RENDER_API_KEY environment variable */
54
+ apiKey?: string;
55
+ /** Render Owner ID - if not provided, will fallback to RENDER_OWNER_ID environment variable */
56
+ ownerId?: string;
57
+ }
58
+ /**
59
+ * Render infrastructure provider
60
+ *
61
+ * Creates Render services with ComputeSDK daemon pre-installed via Docker image.
62
+ */
63
+ declare const render: (providerConfig: RenderConfig) => _computesdk_provider.InfraProvider<RenderInstance>;
64
+
65
+ export { type RailwayConfig, type RailwayInstance, type RenderConfig, type RenderInstance, railway, render };
package/dist/index.js CHANGED
@@ -20,7 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- railway: () => railway
23
+ railway: () => railway,
24
+ render: () => render
24
25
  });
25
26
  module.exports = __toCommonJS(index_exports);
26
27
 
@@ -97,6 +98,7 @@ var railway = (0, import_provider.defineInfraProvider)({
97
98
  input: {
98
99
  projectId,
99
100
  environmentId,
101
+ templateServiceId: "sandbox",
100
102
  source: {
101
103
  image: options?.image ?? "computesdk/compute:latest"
102
104
  },
@@ -206,8 +208,175 @@ var railway = (0, import_provider.defineInfraProvider)({
206
208
  }
207
209
  }
208
210
  });
211
+
212
+ // src/render.ts
213
+ var import_provider2 = require("@computesdk/provider");
214
+ var getAndValidateCredentials2 = (config) => {
215
+ const apiKey = config.apiKey || typeof process !== "undefined" && process.env?.RENDER_API_KEY || "";
216
+ const ownerId = config.ownerId || typeof process !== "undefined" && process.env?.RENDER_OWNER_ID || "";
217
+ if (!apiKey) {
218
+ throw new Error(
219
+ "Missing Render API key. Provide apiKey in config or set RENDER_API_KEY environment variable."
220
+ );
221
+ }
222
+ if (!ownerId) {
223
+ throw new Error(
224
+ "Missing Render Owner ID. Provide ownerId in config or set RENDER_OWNER_ID environment variable."
225
+ );
226
+ }
227
+ return { apiKey, ownerId };
228
+ };
229
+ var fetchRender = async (apiKey, endpoint, options = {}) => {
230
+ const url = `https://api.render.com/v1${endpoint}`;
231
+ const requestOptions = {
232
+ method: "GET",
233
+ ...options,
234
+ headers: {
235
+ "Accept": "application/json",
236
+ "Authorization": `Bearer ${apiKey}`,
237
+ ...options.headers || {}
238
+ }
239
+ };
240
+ const response = await fetch(url, requestOptions);
241
+ if (!response.ok) {
242
+ throw new Error(`Render API error: ${response.status} ${response.statusText}`);
243
+ }
244
+ if (response.status === 204) {
245
+ return {};
246
+ }
247
+ return response.json();
248
+ };
249
+ function buildDaemonEnvVars2(daemonConfig) {
250
+ if (!daemonConfig) {
251
+ return {};
252
+ }
253
+ return {
254
+ COMPUTESDK_ACCESS_TOKEN: daemonConfig.accessToken,
255
+ ...daemonConfig.gatewayUrl && { COMPUTESDK_GATEWAY_URL: daemonConfig.gatewayUrl },
256
+ ...daemonConfig.env
257
+ };
258
+ }
259
+ var render = (0, import_provider2.defineInfraProvider)({
260
+ name: "render",
261
+ methods: {
262
+ create: async (config, options) => {
263
+ const { apiKey, ownerId } = getAndValidateCredentials2(config);
264
+ try {
265
+ const envVars = buildDaemonEnvVars2(options?.daemonConfig);
266
+ const envVarsList = Object.entries(envVars).map(([key, value]) => ({
267
+ key,
268
+ value
269
+ }));
270
+ const createServiceData = {
271
+ type: "web_service",
272
+ autoDeploy: "yes",
273
+ image: {
274
+ ownerId,
275
+ imagePath: options?.image ?? "computesdk/compute:latest"
276
+ },
277
+ serviceDetails: {
278
+ runtime: "image",
279
+ // envSpecificDetails omitted to use image's default CMD/ENTRYPOINT (daemon startup)
280
+ pullRequestPreviewsEnabled: "no",
281
+ ...envVarsList.length > 0 && {
282
+ envVars: envVarsList
283
+ }
284
+ },
285
+ ownerId,
286
+ name: `computesdk-${Date.now()}`
287
+ };
288
+ const responseData = await fetchRender(apiKey, "/services", {
289
+ method: "POST",
290
+ headers: {
291
+ "Content-Type": "application/json"
292
+ },
293
+ body: JSON.stringify(createServiceData)
294
+ });
295
+ if (!responseData) {
296
+ throw new Error("No service returned from Render API - responseData is undefined");
297
+ }
298
+ const service = responseData.service;
299
+ if (!service) {
300
+ throw new Error("No service returned from Render API - responseData.service is undefined");
301
+ }
302
+ if (!service.id) {
303
+ throw new Error(`Service ID is undefined. Full service object: ${JSON.stringify(service, null, 2)}`);
304
+ }
305
+ const instance = {
306
+ serviceId: service.id,
307
+ ownerId
308
+ };
309
+ return {
310
+ instance,
311
+ instanceId: service.id
312
+ };
313
+ } catch (error) {
314
+ throw new Error(
315
+ `Failed to create Render instance: ${error instanceof Error ? error.message : String(error)}`
316
+ );
317
+ }
318
+ },
319
+ getById: async (config, instanceId) => {
320
+ const { apiKey, ownerId } = getAndValidateCredentials2(config);
321
+ try {
322
+ const responseData = await fetchRender(apiKey, `/services/${instanceId}`);
323
+ if (!responseData.id) {
324
+ throw new Error("Service data is missing from Render response");
325
+ }
326
+ const instance = {
327
+ serviceId: responseData.id,
328
+ ownerId
329
+ };
330
+ return {
331
+ instance,
332
+ instanceId: responseData.id
333
+ };
334
+ } catch (error) {
335
+ if (error instanceof Error && error.message.includes("404")) {
336
+ return null;
337
+ }
338
+ throw new Error(
339
+ `Failed to get Render instance: ${error instanceof Error ? error.message : String(error)}`
340
+ );
341
+ }
342
+ },
343
+ list: async (config) => {
344
+ const { apiKey, ownerId } = getAndValidateCredentials2(config);
345
+ try {
346
+ const responseData = await fetchRender(apiKey, "/services?includePreviews=true");
347
+ const items = responseData || [];
348
+ return items.map((item) => {
349
+ const service = item.service;
350
+ const instance = {
351
+ serviceId: service.id,
352
+ ownerId
353
+ };
354
+ return {
355
+ instance,
356
+ instanceId: service.id
357
+ };
358
+ });
359
+ } catch (error) {
360
+ throw new Error(
361
+ `Failed to list Render instances: ${error instanceof Error ? error.message : String(error)}`
362
+ );
363
+ }
364
+ },
365
+ destroy: async (config, instanceId) => {
366
+ const { apiKey } = getAndValidateCredentials2(config);
367
+ try {
368
+ await fetchRender(apiKey, `/services/${instanceId}`, {
369
+ method: "DELETE"
370
+ });
371
+ } catch (error) {
372
+ console.warn(`Render destroy warning: ${error instanceof Error ? error.message : String(error)}`);
373
+ }
374
+ }
375
+ }
376
+ });
209
377
  // Annotate the CommonJS export names for ESM import in node:
210
378
  0 && (module.exports = {
211
- railway
379
+ railway,
380
+ render
212
381
  });
213
382
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/railway.ts"],"sourcesContent":["/**\n * @computesdk/gateway - Infrastructure Provider Implementations\n * \n * Infrastructure-only providers for the ComputeSDK gateway server.\n * These providers handle resource provisioning but don't include native sandbox capabilities.\n * The gateway server installs the ComputeSDK daemon to add sandbox features.\n */\n\n// Export Railway infrastructure provider\nexport { railway } from './railway.js';\nexport type { RailwayConfig, RailwayInstance } from './railway.js';\n\n// Re-export infrastructure provider types from @computesdk/provider\nexport type { InfraProvider, DaemonConfig } from '@computesdk/provider';\n","/**\n * Railway Infrastructure Provider\n * \n * Provides infrastructure-only methods for creating/destroying Railway services.\n * Used by the gateway server to provision compute resources with daemon pre-installed.\n */\n\nimport { defineInfraProvider } from '@computesdk/provider';\nimport type { DaemonConfig, CreateSandboxOptions } from '@computesdk/provider';\n\n/**\n * Railway service instance\n */\nexport interface RailwayInstance {\n serviceId: string;\n projectId: string;\n environmentId: string;\n}\n\n/**\n * Railway provider configuration\n */\nexport interface RailwayConfig {\n /** Railway API key - if not provided, will fallback to RAILWAY_API_KEY environment variable */\n apiKey?: string;\n /** Railway Project ID */\n projectId?: string;\n /** Railway Environment ID - if not provided, will fallback to RAILWAY_ENVIRONMENT_ID environment variable */\n environmentId?: string;\n}\n\n/**\n * Get and validate Railway credentials from config and environment\n */\nexport const getAndValidateCredentials = (config: RailwayConfig) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.RAILWAY_API_KEY) || '';\n const projectId = config.projectId || (typeof process !== 'undefined' && process.env?.RAILWAY_PROJECT_ID) || '';\n const environmentId = config.environmentId || (typeof process !== 'undefined' && process.env?.RAILWAY_ENVIRONMENT_ID) || '';\n\n if (!apiKey) {\n throw new Error(\n 'Missing Railway API key. Provide apiKey in config or set RAILWAY_API_KEY environment variable.'\n );\n }\n\n if (!projectId) {\n throw new Error(\n 'Missing Railway Project ID. Provide projectId in config or set RAILWAY_PROJECT_ID environment variable.'\n );\n }\n\n if (!environmentId) {\n throw new Error(\n 'Missing Railway Environment ID. Provide environmentId in config or set RAILWAY_ENVIRONMENT_ID environment variable.'\n );\n }\n\n return { apiKey, projectId, environmentId };\n};\n\nconst GRAPHQL_QUERIES = {\n CREATE_SERVICE: `mutation ServiceCreate($input: ServiceCreateInput!) { serviceCreate(input: $input) { id name } }`,\n GET_SERVICE: `query Service($serviceId: String!) { service(id: $serviceId) { id name createdAt } }`,\n LIST_SERVICES: `query Project($projectId: String!) { project(id: $projectId) { services { edges { node { id name createdAt updatedAt } } } } }`,\n DELETE_SERVICE: `mutation ServiceDelete($id: String!) { serviceDelete(id: $id) }`\n};\n\nconst handleGraphQLErrors = (data: any) => {\n if (data.errors) {\n throw new Error(`Railway GraphQL error: ${data.errors.map((e: any) => e.message).join(', ')}`);\n }\n};\n\nexport const fetchRailway = async (\n apiKey: string, \n mutation: any,\n) => {\n const response = await fetch('https://backboard.railway.com/graphql/v2', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n body: JSON.stringify(mutation)\n });\n\n if (!response.ok) {\n throw new Error(`Railway API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n handleGraphQLErrors(data);\n\n return data.data;\n};\n\n/**\n * Convert daemon config to Railway environment variables\n */\nfunction buildDaemonEnvVars(daemonConfig?: DaemonConfig): Record<string, string> {\n if (!daemonConfig) {\n return {};\n }\n\n return {\n COMPUTESDK_ACCESS_TOKEN: daemonConfig.accessToken,\n ...(daemonConfig.gatewayUrl && { COMPUTESDK_GATEWAY_URL: daemonConfig.gatewayUrl }),\n ...daemonConfig.env,\n };\n}\n\n/**\n * Railway infrastructure provider\n * \n * Creates Railway services with ComputeSDK daemon pre-installed via Docker image.\n */\nexport const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({\n name: 'railway',\n \n methods: {\n create: async (config: RailwayConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n // Build environment variables for daemon\n const envVars = buildDaemonEnvVars(options?.daemonConfig);\n\n const mutation = {\n query: GRAPHQL_QUERIES.CREATE_SERVICE,\n variables: {\n input: {\n projectId,\n environmentId,\n source: {\n image: options?.image ?? 'computesdk/compute:latest'\n },\n ...(Object.keys(envVars).length > 0 && {\n variables: envVars\n })\n }\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n const service = responseData?.serviceCreate;\n \n if (!service) {\n throw new Error('No service returned from Railway API - responseData.serviceCreate is undefined');\n }\n \n if (!service.id) {\n throw new Error(`Service ID is undefined. Full service object: ${JSON.stringify(service, null, 2)}`);\n }\n\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n } catch (error) {\n throw new Error(\n `Failed to create Railway instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: RailwayConfig, instanceId: string) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.GET_SERVICE,\n variables: {\n serviceId: instanceId\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n \n if (responseData === null) {\n return null;\n }\n \n const service = responseData?.service;\n \n if (!service) {\n throw new Error('Service data is missing from Railway response');\n }\n\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n } catch (error) {\n throw new Error(\n `Failed to get Railway instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: RailwayConfig) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.LIST_SERVICES,\n variables: {\n projectId\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n const services = responseData?.project?.services?.edges || [];\n \n return services.map((edge: any) => {\n const service = edge.node;\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n });\n } catch (error) {\n throw new Error(\n `Failed to list Railway instances: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: RailwayConfig, instanceId: string) => {\n const { apiKey } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.DELETE_SERVICE,\n variables: {\n id: instanceId\n }\n };\n\n await fetchRailway(apiKey, mutation);\n } catch (error) {\n // For destroy operations, we log warnings rather than throwing\n // since the resource may already be gone\n console.warn(`Railway destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n },\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/railway.ts","../src/render.ts"],"sourcesContent":["/**\n * @computesdk/gateway - Infrastructure Provider Implementations\n *\n * Infrastructure-only providers for the ComputeSDK gateway server.\n * These providers handle resource provisioning but don't include native sandbox capabilities.\n * The gateway server installs the ComputeSDK daemon to add sandbox features.\n */\n\n// Export Railway infrastructure provider\nexport { railway } from './railway.js';\nexport type { RailwayConfig, RailwayInstance } from './railway.js';\n\n// Export Render infrastructure provider\nexport { render } from './render.js';\nexport type { RenderConfig, RenderInstance } from './render.js';\n\n// Re-export infrastructure provider types from @computesdk/provider\nexport type { InfraProvider, DaemonConfig } from '@computesdk/provider';\n","/**\n * Railway Infrastructure Provider\n * \n * Provides infrastructure-only methods for creating/destroying Railway services.\n * Used by the gateway server to provision compute resources with daemon pre-installed.\n */\n\nimport { defineInfraProvider } from '@computesdk/provider';\nimport type { DaemonConfig, CreateSandboxOptions } from '@computesdk/provider';\n\n/**\n * Railway service instance\n */\nexport interface RailwayInstance {\n serviceId: string;\n projectId: string;\n environmentId: string;\n}\n\n/**\n * Railway provider configuration\n */\nexport interface RailwayConfig {\n /** Railway API key - if not provided, will fallback to RAILWAY_API_KEY environment variable */\n apiKey?: string;\n /** Railway Project ID */\n projectId?: string;\n /** Railway Environment ID - if not provided, will fallback to RAILWAY_ENVIRONMENT_ID environment variable */\n environmentId?: string;\n}\n\n/**\n * Get and validate Railway credentials from config and environment\n */\nexport const getAndValidateCredentials = (config: RailwayConfig) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.RAILWAY_API_KEY) || '';\n const projectId = config.projectId || (typeof process !== 'undefined' && process.env?.RAILWAY_PROJECT_ID) || '';\n const environmentId = config.environmentId || (typeof process !== 'undefined' && process.env?.RAILWAY_ENVIRONMENT_ID) || '';\n\n if (!apiKey) {\n throw new Error(\n 'Missing Railway API key. Provide apiKey in config or set RAILWAY_API_KEY environment variable.'\n );\n }\n\n if (!projectId) {\n throw new Error(\n 'Missing Railway Project ID. Provide projectId in config or set RAILWAY_PROJECT_ID environment variable.'\n );\n }\n\n if (!environmentId) {\n throw new Error(\n 'Missing Railway Environment ID. Provide environmentId in config or set RAILWAY_ENVIRONMENT_ID environment variable.'\n );\n }\n\n return { apiKey, projectId, environmentId };\n};\n\nconst GRAPHQL_QUERIES = {\n CREATE_SERVICE: `mutation ServiceCreate($input: ServiceCreateInput!) { serviceCreate(input: $input) { id name } }`,\n GET_SERVICE: `query Service($serviceId: String!) { service(id: $serviceId) { id name createdAt } }`,\n LIST_SERVICES: `query Project($projectId: String!) { project(id: $projectId) { services { edges { node { id name createdAt updatedAt } } } } }`,\n DELETE_SERVICE: `mutation ServiceDelete($id: String!) { serviceDelete(id: $id) }`\n};\n\nconst handleGraphQLErrors = (data: any) => {\n if (data.errors) {\n throw new Error(`Railway GraphQL error: ${data.errors.map((e: any) => e.message).join(', ')}`);\n }\n};\n\nexport const fetchRailway = async (\n apiKey: string, \n mutation: any,\n) => {\n const response = await fetch('https://backboard.railway.com/graphql/v2', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n body: JSON.stringify(mutation)\n });\n\n if (!response.ok) {\n throw new Error(`Railway API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n handleGraphQLErrors(data);\n\n return data.data;\n};\n\n/**\n * Convert daemon config to Railway environment variables\n */\nfunction buildDaemonEnvVars(daemonConfig?: DaemonConfig): Record<string, string> {\n if (!daemonConfig) {\n return {};\n }\n\n return {\n COMPUTESDK_ACCESS_TOKEN: daemonConfig.accessToken,\n ...(daemonConfig.gatewayUrl && { COMPUTESDK_GATEWAY_URL: daemonConfig.gatewayUrl }),\n ...daemonConfig.env,\n };\n}\n\n/**\n * Railway infrastructure provider\n * \n * Creates Railway services with ComputeSDK daemon pre-installed via Docker image.\n */\nexport const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({\n name: 'railway',\n \n methods: {\n create: async (config: RailwayConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n // Build environment variables for daemon\n const envVars = buildDaemonEnvVars(options?.daemonConfig);\n\n const mutation = {\n query: GRAPHQL_QUERIES.CREATE_SERVICE,\n variables: {\n input: {\n projectId,\n environmentId,\n templateServiceId: 'sandbox',\n source: {\n image: options?.image ?? 'computesdk/compute:latest',\n },\n ...(Object.keys(envVars).length > 0 && {\n variables: envVars\n })\n }\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n const service = responseData?.serviceCreate;\n \n if (!service) {\n throw new Error('No service returned from Railway API - responseData.serviceCreate is undefined');\n }\n \n if (!service.id) {\n throw new Error(`Service ID is undefined. Full service object: ${JSON.stringify(service, null, 2)}`);\n }\n\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n } catch (error) {\n throw new Error(\n `Failed to create Railway instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: RailwayConfig, instanceId: string) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.GET_SERVICE,\n variables: {\n serviceId: instanceId\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n \n if (responseData === null) {\n return null;\n }\n \n const service = responseData?.service;\n \n if (!service) {\n throw new Error('Service data is missing from Railway response');\n }\n\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n } catch (error) {\n throw new Error(\n `Failed to get Railway instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: RailwayConfig) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.LIST_SERVICES,\n variables: {\n projectId\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n const services = responseData?.project?.services?.edges || [];\n \n return services.map((edge: any) => {\n const service = edge.node;\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n });\n } catch (error) {\n throw new Error(\n `Failed to list Railway instances: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: RailwayConfig, instanceId: string) => {\n const { apiKey } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.DELETE_SERVICE,\n variables: {\n id: instanceId\n }\n };\n\n await fetchRailway(apiKey, mutation);\n } catch (error) {\n // For destroy operations, we log warnings rather than throwing\n // since the resource may already be gone\n console.warn(`Railway destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n },\n});\n","/**\n * Render Infrastructure Provider\n *\n * Provides infrastructure-only methods for creating/destroying Render services.\n * Used by the gateway server to provision compute resources with daemon pre-installed.\n */\n\nimport { defineInfraProvider } from '@computesdk/provider';\nimport type { DaemonConfig, CreateSandboxOptions } from '@computesdk/provider';\n\n/**\n * Render service instance\n */\nexport interface RenderInstance {\n serviceId: string;\n ownerId: string;\n}\n\n/**\n * Render provider configuration\n */\nexport interface RenderConfig {\n /** Render API key - if not provided, will fallback to RENDER_API_KEY environment variable */\n apiKey?: string;\n /** Render Owner ID - if not provided, will fallback to RENDER_OWNER_ID environment variable */\n ownerId?: string;\n}\n\n/**\n * Get and validate Render credentials from config and environment\n */\nexport const getAndValidateCredentials = (config: RenderConfig) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.RENDER_API_KEY) || '';\n const ownerId = config.ownerId || (typeof process !== 'undefined' && process.env?.RENDER_OWNER_ID) || '';\n\n if (!apiKey) {\n throw new Error(\n 'Missing Render API key. Provide apiKey in config or set RENDER_API_KEY environment variable.'\n );\n }\n\n if (!ownerId) {\n throw new Error(\n 'Missing Render Owner ID. Provide ownerId in config or set RENDER_OWNER_ID environment variable.'\n );\n }\n\n return { apiKey, ownerId };\n};\n\nexport const fetchRender = async (\n apiKey: string,\n endpoint: string,\n options: RequestInit = {}\n) => {\n const url = `https://api.render.com/v1${endpoint}`;\n const requestOptions = {\n method: 'GET',\n ...options,\n headers: {\n 'Accept': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n ...(options.headers || {})\n }\n };\n\n const response = await fetch(url, requestOptions);\n\n if (!response.ok) {\n throw new Error(`Render API error: ${response.status} ${response.statusText}`);\n }\n\n // Handle 204 No Content responses (like DELETE operations)\n if (response.status === 204) {\n return {};\n }\n\n return response.json();\n};\n\n/**\n * Convert daemon config to Render environment variables\n */\nfunction buildDaemonEnvVars(daemonConfig?: DaemonConfig): Record<string, string> {\n if (!daemonConfig) {\n return {};\n }\n\n return {\n COMPUTESDK_ACCESS_TOKEN: daemonConfig.accessToken,\n ...(daemonConfig.gatewayUrl && { COMPUTESDK_GATEWAY_URL: daemonConfig.gatewayUrl }),\n ...daemonConfig.env,\n };\n}\n\n/**\n * Render infrastructure provider\n *\n * Creates Render services with ComputeSDK daemon pre-installed via Docker image.\n */\nexport const render = defineInfraProvider<RenderInstance, RenderConfig>({\n name: 'render',\n\n methods: {\n create: async (config: RenderConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => {\n const { apiKey, ownerId } = getAndValidateCredentials(config);\n\n try {\n // Build environment variables for daemon\n const envVars = buildDaemonEnvVars(options?.daemonConfig);\n\n // Convert env vars to Render format\n const envVarsList = Object.entries(envVars).map(([key, value]) => ({\n key,\n value\n }));\n\n const createServiceData = {\n type: 'web_service',\n autoDeploy: 'yes',\n image: {\n ownerId: ownerId,\n imagePath: options?.image ?? 'computesdk/compute:latest'\n },\n serviceDetails: {\n runtime: 'image',\n // envSpecificDetails omitted to use image's default CMD/ENTRYPOINT (daemon startup)\n pullRequestPreviewsEnabled: 'no',\n ...(envVarsList.length > 0 && {\n envVars: envVarsList\n })\n },\n ownerId: ownerId,\n name: `computesdk-${Date.now()}`\n };\n\n const responseData = await fetchRender(apiKey, '/services', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(createServiceData)\n });\n\n if (!responseData) {\n throw new Error('No service returned from Render API - responseData is undefined');\n }\n\n // Render API returns { service: { id: \"...\", ... }, deployId: \"...\" }\n const service = responseData.service;\n if (!service) {\n throw new Error('No service returned from Render API - responseData.service is undefined');\n }\n\n if (!service.id) {\n throw new Error(`Service ID is undefined. Full service object: ${JSON.stringify(service, null, 2)}`);\n }\n\n const instance: RenderInstance = {\n serviceId: service.id,\n ownerId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n } catch (error) {\n throw new Error(\n `Failed to create Render instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: RenderConfig, instanceId: string) => {\n const { apiKey, ownerId } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchRender(apiKey, `/services/${instanceId}`);\n\n if (!responseData.id) {\n throw new Error('Service data is missing from Render response');\n }\n\n const instance: RenderInstance = {\n serviceId: responseData.id,\n ownerId,\n };\n\n return {\n instance,\n instanceId: responseData.id\n };\n } catch (error) {\n // If it's a 404, return null to indicate service not found\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw new Error(\n `Failed to get Render instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n list: async (config: RenderConfig) => {\n const { apiKey, ownerId } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchRender(apiKey, '/services?includePreviews=true');\n\n // Extract services from the array response - each item has a \"service\" property\n const items = responseData || [];\n\n return items.map((item: any) => {\n const service = item.service;\n const instance: RenderInstance = {\n serviceId: service.id,\n ownerId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n });\n } catch (error) {\n throw new Error(\n `Failed to list Render instances: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: RenderConfig, instanceId: string) => {\n const { apiKey } = getAndValidateCredentials(config);\n\n try {\n await fetchRender(apiKey, `/services/${instanceId}`, {\n method: 'DELETE'\n });\n } catch (error) {\n // For destroy operations, we log warnings rather than throwing\n // since the resource may already be gone\n console.warn(`Render destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n },\n});\n"],"mappings":"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","names":["import_provider","getAndValidateCredentials","buildDaemonEnvVars"]}
package/dist/index.mjs CHANGED
@@ -71,6 +71,7 @@ var railway = defineInfraProvider({
71
71
  input: {
72
72
  projectId,
73
73
  environmentId,
74
+ templateServiceId: "sandbox",
74
75
  source: {
75
76
  image: options?.image ?? "computesdk/compute:latest"
76
77
  },
@@ -180,7 +181,174 @@ var railway = defineInfraProvider({
180
181
  }
181
182
  }
182
183
  });
184
+
185
+ // src/render.ts
186
+ import { defineInfraProvider as defineInfraProvider2 } from "@computesdk/provider";
187
+ var getAndValidateCredentials2 = (config) => {
188
+ const apiKey = config.apiKey || typeof process !== "undefined" && process.env?.RENDER_API_KEY || "";
189
+ const ownerId = config.ownerId || typeof process !== "undefined" && process.env?.RENDER_OWNER_ID || "";
190
+ if (!apiKey) {
191
+ throw new Error(
192
+ "Missing Render API key. Provide apiKey in config or set RENDER_API_KEY environment variable."
193
+ );
194
+ }
195
+ if (!ownerId) {
196
+ throw new Error(
197
+ "Missing Render Owner ID. Provide ownerId in config or set RENDER_OWNER_ID environment variable."
198
+ );
199
+ }
200
+ return { apiKey, ownerId };
201
+ };
202
+ var fetchRender = async (apiKey, endpoint, options = {}) => {
203
+ const url = `https://api.render.com/v1${endpoint}`;
204
+ const requestOptions = {
205
+ method: "GET",
206
+ ...options,
207
+ headers: {
208
+ "Accept": "application/json",
209
+ "Authorization": `Bearer ${apiKey}`,
210
+ ...options.headers || {}
211
+ }
212
+ };
213
+ const response = await fetch(url, requestOptions);
214
+ if (!response.ok) {
215
+ throw new Error(`Render API error: ${response.status} ${response.statusText}`);
216
+ }
217
+ if (response.status === 204) {
218
+ return {};
219
+ }
220
+ return response.json();
221
+ };
222
+ function buildDaemonEnvVars2(daemonConfig) {
223
+ if (!daemonConfig) {
224
+ return {};
225
+ }
226
+ return {
227
+ COMPUTESDK_ACCESS_TOKEN: daemonConfig.accessToken,
228
+ ...daemonConfig.gatewayUrl && { COMPUTESDK_GATEWAY_URL: daemonConfig.gatewayUrl },
229
+ ...daemonConfig.env
230
+ };
231
+ }
232
+ var render = defineInfraProvider2({
233
+ name: "render",
234
+ methods: {
235
+ create: async (config, options) => {
236
+ const { apiKey, ownerId } = getAndValidateCredentials2(config);
237
+ try {
238
+ const envVars = buildDaemonEnvVars2(options?.daemonConfig);
239
+ const envVarsList = Object.entries(envVars).map(([key, value]) => ({
240
+ key,
241
+ value
242
+ }));
243
+ const createServiceData = {
244
+ type: "web_service",
245
+ autoDeploy: "yes",
246
+ image: {
247
+ ownerId,
248
+ imagePath: options?.image ?? "computesdk/compute:latest"
249
+ },
250
+ serviceDetails: {
251
+ runtime: "image",
252
+ // envSpecificDetails omitted to use image's default CMD/ENTRYPOINT (daemon startup)
253
+ pullRequestPreviewsEnabled: "no",
254
+ ...envVarsList.length > 0 && {
255
+ envVars: envVarsList
256
+ }
257
+ },
258
+ ownerId,
259
+ name: `computesdk-${Date.now()}`
260
+ };
261
+ const responseData = await fetchRender(apiKey, "/services", {
262
+ method: "POST",
263
+ headers: {
264
+ "Content-Type": "application/json"
265
+ },
266
+ body: JSON.stringify(createServiceData)
267
+ });
268
+ if (!responseData) {
269
+ throw new Error("No service returned from Render API - responseData is undefined");
270
+ }
271
+ const service = responseData.service;
272
+ if (!service) {
273
+ throw new Error("No service returned from Render API - responseData.service is undefined");
274
+ }
275
+ if (!service.id) {
276
+ throw new Error(`Service ID is undefined. Full service object: ${JSON.stringify(service, null, 2)}`);
277
+ }
278
+ const instance = {
279
+ serviceId: service.id,
280
+ ownerId
281
+ };
282
+ return {
283
+ instance,
284
+ instanceId: service.id
285
+ };
286
+ } catch (error) {
287
+ throw new Error(
288
+ `Failed to create Render instance: ${error instanceof Error ? error.message : String(error)}`
289
+ );
290
+ }
291
+ },
292
+ getById: async (config, instanceId) => {
293
+ const { apiKey, ownerId } = getAndValidateCredentials2(config);
294
+ try {
295
+ const responseData = await fetchRender(apiKey, `/services/${instanceId}`);
296
+ if (!responseData.id) {
297
+ throw new Error("Service data is missing from Render response");
298
+ }
299
+ const instance = {
300
+ serviceId: responseData.id,
301
+ ownerId
302
+ };
303
+ return {
304
+ instance,
305
+ instanceId: responseData.id
306
+ };
307
+ } catch (error) {
308
+ if (error instanceof Error && error.message.includes("404")) {
309
+ return null;
310
+ }
311
+ throw new Error(
312
+ `Failed to get Render instance: ${error instanceof Error ? error.message : String(error)}`
313
+ );
314
+ }
315
+ },
316
+ list: async (config) => {
317
+ const { apiKey, ownerId } = getAndValidateCredentials2(config);
318
+ try {
319
+ const responseData = await fetchRender(apiKey, "/services?includePreviews=true");
320
+ const items = responseData || [];
321
+ return items.map((item) => {
322
+ const service = item.service;
323
+ const instance = {
324
+ serviceId: service.id,
325
+ ownerId
326
+ };
327
+ return {
328
+ instance,
329
+ instanceId: service.id
330
+ };
331
+ });
332
+ } catch (error) {
333
+ throw new Error(
334
+ `Failed to list Render instances: ${error instanceof Error ? error.message : String(error)}`
335
+ );
336
+ }
337
+ },
338
+ destroy: async (config, instanceId) => {
339
+ const { apiKey } = getAndValidateCredentials2(config);
340
+ try {
341
+ await fetchRender(apiKey, `/services/${instanceId}`, {
342
+ method: "DELETE"
343
+ });
344
+ } catch (error) {
345
+ console.warn(`Render destroy warning: ${error instanceof Error ? error.message : String(error)}`);
346
+ }
347
+ }
348
+ }
349
+ });
183
350
  export {
184
- railway
351
+ railway,
352
+ render
185
353
  };
186
354
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/railway.ts"],"sourcesContent":["/**\n * Railway Infrastructure Provider\n * \n * Provides infrastructure-only methods for creating/destroying Railway services.\n * Used by the gateway server to provision compute resources with daemon pre-installed.\n */\n\nimport { defineInfraProvider } from '@computesdk/provider';\nimport type { DaemonConfig, CreateSandboxOptions } from '@computesdk/provider';\n\n/**\n * Railway service instance\n */\nexport interface RailwayInstance {\n serviceId: string;\n projectId: string;\n environmentId: string;\n}\n\n/**\n * Railway provider configuration\n */\nexport interface RailwayConfig {\n /** Railway API key - if not provided, will fallback to RAILWAY_API_KEY environment variable */\n apiKey?: string;\n /** Railway Project ID */\n projectId?: string;\n /** Railway Environment ID - if not provided, will fallback to RAILWAY_ENVIRONMENT_ID environment variable */\n environmentId?: string;\n}\n\n/**\n * Get and validate Railway credentials from config and environment\n */\nexport const getAndValidateCredentials = (config: RailwayConfig) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.RAILWAY_API_KEY) || '';\n const projectId = config.projectId || (typeof process !== 'undefined' && process.env?.RAILWAY_PROJECT_ID) || '';\n const environmentId = config.environmentId || (typeof process !== 'undefined' && process.env?.RAILWAY_ENVIRONMENT_ID) || '';\n\n if (!apiKey) {\n throw new Error(\n 'Missing Railway API key. Provide apiKey in config or set RAILWAY_API_KEY environment variable.'\n );\n }\n\n if (!projectId) {\n throw new Error(\n 'Missing Railway Project ID. Provide projectId in config or set RAILWAY_PROJECT_ID environment variable.'\n );\n }\n\n if (!environmentId) {\n throw new Error(\n 'Missing Railway Environment ID. Provide environmentId in config or set RAILWAY_ENVIRONMENT_ID environment variable.'\n );\n }\n\n return { apiKey, projectId, environmentId };\n};\n\nconst GRAPHQL_QUERIES = {\n CREATE_SERVICE: `mutation ServiceCreate($input: ServiceCreateInput!) { serviceCreate(input: $input) { id name } }`,\n GET_SERVICE: `query Service($serviceId: String!) { service(id: $serviceId) { id name createdAt } }`,\n LIST_SERVICES: `query Project($projectId: String!) { project(id: $projectId) { services { edges { node { id name createdAt updatedAt } } } } }`,\n DELETE_SERVICE: `mutation ServiceDelete($id: String!) { serviceDelete(id: $id) }`\n};\n\nconst handleGraphQLErrors = (data: any) => {\n if (data.errors) {\n throw new Error(`Railway GraphQL error: ${data.errors.map((e: any) => e.message).join(', ')}`);\n }\n};\n\nexport const fetchRailway = async (\n apiKey: string, \n mutation: any,\n) => {\n const response = await fetch('https://backboard.railway.com/graphql/v2', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n body: JSON.stringify(mutation)\n });\n\n if (!response.ok) {\n throw new Error(`Railway API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n handleGraphQLErrors(data);\n\n return data.data;\n};\n\n/**\n * Convert daemon config to Railway environment variables\n */\nfunction buildDaemonEnvVars(daemonConfig?: DaemonConfig): Record<string, string> {\n if (!daemonConfig) {\n return {};\n }\n\n return {\n COMPUTESDK_ACCESS_TOKEN: daemonConfig.accessToken,\n ...(daemonConfig.gatewayUrl && { COMPUTESDK_GATEWAY_URL: daemonConfig.gatewayUrl }),\n ...daemonConfig.env,\n };\n}\n\n/**\n * Railway infrastructure provider\n * \n * Creates Railway services with ComputeSDK daemon pre-installed via Docker image.\n */\nexport const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({\n name: 'railway',\n \n methods: {\n create: async (config: RailwayConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n // Build environment variables for daemon\n const envVars = buildDaemonEnvVars(options?.daemonConfig);\n\n const mutation = {\n query: GRAPHQL_QUERIES.CREATE_SERVICE,\n variables: {\n input: {\n projectId,\n environmentId,\n source: {\n image: options?.image ?? 'computesdk/compute:latest'\n },\n ...(Object.keys(envVars).length > 0 && {\n variables: envVars\n })\n }\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n const service = responseData?.serviceCreate;\n \n if (!service) {\n throw new Error('No service returned from Railway API - responseData.serviceCreate is undefined');\n }\n \n if (!service.id) {\n throw new Error(`Service ID is undefined. Full service object: ${JSON.stringify(service, null, 2)}`);\n }\n\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n } catch (error) {\n throw new Error(\n `Failed to create Railway instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: RailwayConfig, instanceId: string) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.GET_SERVICE,\n variables: {\n serviceId: instanceId\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n \n if (responseData === null) {\n return null;\n }\n \n const service = responseData?.service;\n \n if (!service) {\n throw new Error('Service data is missing from Railway response');\n }\n\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n } catch (error) {\n throw new Error(\n `Failed to get Railway instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: RailwayConfig) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.LIST_SERVICES,\n variables: {\n projectId\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n const services = responseData?.project?.services?.edges || [];\n \n return services.map((edge: any) => {\n const service = edge.node;\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n });\n } catch (error) {\n throw new Error(\n `Failed to list Railway instances: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: RailwayConfig, instanceId: string) => {\n const { apiKey } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.DELETE_SERVICE,\n variables: {\n id: instanceId\n }\n };\n\n await fetchRailway(apiKey, mutation);\n } catch (error) {\n // For destroy operations, we log warnings rather than throwing\n // since the resource may already be gone\n console.warn(`Railway destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n },\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/railway.ts","../src/render.ts"],"sourcesContent":["/**\n * Railway Infrastructure Provider\n * \n * Provides infrastructure-only methods for creating/destroying Railway services.\n * Used by the gateway server to provision compute resources with daemon pre-installed.\n */\n\nimport { defineInfraProvider } from '@computesdk/provider';\nimport type { DaemonConfig, CreateSandboxOptions } from '@computesdk/provider';\n\n/**\n * Railway service instance\n */\nexport interface RailwayInstance {\n serviceId: string;\n projectId: string;\n environmentId: string;\n}\n\n/**\n * Railway provider configuration\n */\nexport interface RailwayConfig {\n /** Railway API key - if not provided, will fallback to RAILWAY_API_KEY environment variable */\n apiKey?: string;\n /** Railway Project ID */\n projectId?: string;\n /** Railway Environment ID - if not provided, will fallback to RAILWAY_ENVIRONMENT_ID environment variable */\n environmentId?: string;\n}\n\n/**\n * Get and validate Railway credentials from config and environment\n */\nexport const getAndValidateCredentials = (config: RailwayConfig) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.RAILWAY_API_KEY) || '';\n const projectId = config.projectId || (typeof process !== 'undefined' && process.env?.RAILWAY_PROJECT_ID) || '';\n const environmentId = config.environmentId || (typeof process !== 'undefined' && process.env?.RAILWAY_ENVIRONMENT_ID) || '';\n\n if (!apiKey) {\n throw new Error(\n 'Missing Railway API key. Provide apiKey in config or set RAILWAY_API_KEY environment variable.'\n );\n }\n\n if (!projectId) {\n throw new Error(\n 'Missing Railway Project ID. Provide projectId in config or set RAILWAY_PROJECT_ID environment variable.'\n );\n }\n\n if (!environmentId) {\n throw new Error(\n 'Missing Railway Environment ID. Provide environmentId in config or set RAILWAY_ENVIRONMENT_ID environment variable.'\n );\n }\n\n return { apiKey, projectId, environmentId };\n};\n\nconst GRAPHQL_QUERIES = {\n CREATE_SERVICE: `mutation ServiceCreate($input: ServiceCreateInput!) { serviceCreate(input: $input) { id name } }`,\n GET_SERVICE: `query Service($serviceId: String!) { service(id: $serviceId) { id name createdAt } }`,\n LIST_SERVICES: `query Project($projectId: String!) { project(id: $projectId) { services { edges { node { id name createdAt updatedAt } } } } }`,\n DELETE_SERVICE: `mutation ServiceDelete($id: String!) { serviceDelete(id: $id) }`\n};\n\nconst handleGraphQLErrors = (data: any) => {\n if (data.errors) {\n throw new Error(`Railway GraphQL error: ${data.errors.map((e: any) => e.message).join(', ')}`);\n }\n};\n\nexport const fetchRailway = async (\n apiKey: string, \n mutation: any,\n) => {\n const response = await fetch('https://backboard.railway.com/graphql/v2', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n body: JSON.stringify(mutation)\n });\n\n if (!response.ok) {\n throw new Error(`Railway API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n handleGraphQLErrors(data);\n\n return data.data;\n};\n\n/**\n * Convert daemon config to Railway environment variables\n */\nfunction buildDaemonEnvVars(daemonConfig?: DaemonConfig): Record<string, string> {\n if (!daemonConfig) {\n return {};\n }\n\n return {\n COMPUTESDK_ACCESS_TOKEN: daemonConfig.accessToken,\n ...(daemonConfig.gatewayUrl && { COMPUTESDK_GATEWAY_URL: daemonConfig.gatewayUrl }),\n ...daemonConfig.env,\n };\n}\n\n/**\n * Railway infrastructure provider\n * \n * Creates Railway services with ComputeSDK daemon pre-installed via Docker image.\n */\nexport const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({\n name: 'railway',\n \n methods: {\n create: async (config: RailwayConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n // Build environment variables for daemon\n const envVars = buildDaemonEnvVars(options?.daemonConfig);\n\n const mutation = {\n query: GRAPHQL_QUERIES.CREATE_SERVICE,\n variables: {\n input: {\n projectId,\n environmentId,\n templateServiceId: 'sandbox',\n source: {\n image: options?.image ?? 'computesdk/compute:latest',\n },\n ...(Object.keys(envVars).length > 0 && {\n variables: envVars\n })\n }\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n const service = responseData?.serviceCreate;\n \n if (!service) {\n throw new Error('No service returned from Railway API - responseData.serviceCreate is undefined');\n }\n \n if (!service.id) {\n throw new Error(`Service ID is undefined. Full service object: ${JSON.stringify(service, null, 2)}`);\n }\n\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n } catch (error) {\n throw new Error(\n `Failed to create Railway instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: RailwayConfig, instanceId: string) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.GET_SERVICE,\n variables: {\n serviceId: instanceId\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n \n if (responseData === null) {\n return null;\n }\n \n const service = responseData?.service;\n \n if (!service) {\n throw new Error('Service data is missing from Railway response');\n }\n\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n } catch (error) {\n throw new Error(\n `Failed to get Railway instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n \n list: async (config: RailwayConfig) => {\n const { apiKey, projectId, environmentId } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.LIST_SERVICES,\n variables: {\n projectId\n }\n };\n\n const responseData = await fetchRailway(apiKey, mutation);\n const services = responseData?.project?.services?.edges || [];\n \n return services.map((edge: any) => {\n const service = edge.node;\n const instance: RailwayInstance = {\n serviceId: service.id,\n projectId,\n environmentId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n });\n } catch (error) {\n throw new Error(\n `Failed to list Railway instances: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: RailwayConfig, instanceId: string) => {\n const { apiKey } = getAndValidateCredentials(config);\n\n try {\n const mutation = {\n query: GRAPHQL_QUERIES.DELETE_SERVICE,\n variables: {\n id: instanceId\n }\n };\n\n await fetchRailway(apiKey, mutation);\n } catch (error) {\n // For destroy operations, we log warnings rather than throwing\n // since the resource may already be gone\n console.warn(`Railway destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n },\n});\n","/**\n * Render Infrastructure Provider\n *\n * Provides infrastructure-only methods for creating/destroying Render services.\n * Used by the gateway server to provision compute resources with daemon pre-installed.\n */\n\nimport { defineInfraProvider } from '@computesdk/provider';\nimport type { DaemonConfig, CreateSandboxOptions } from '@computesdk/provider';\n\n/**\n * Render service instance\n */\nexport interface RenderInstance {\n serviceId: string;\n ownerId: string;\n}\n\n/**\n * Render provider configuration\n */\nexport interface RenderConfig {\n /** Render API key - if not provided, will fallback to RENDER_API_KEY environment variable */\n apiKey?: string;\n /** Render Owner ID - if not provided, will fallback to RENDER_OWNER_ID environment variable */\n ownerId?: string;\n}\n\n/**\n * Get and validate Render credentials from config and environment\n */\nexport const getAndValidateCredentials = (config: RenderConfig) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.RENDER_API_KEY) || '';\n const ownerId = config.ownerId || (typeof process !== 'undefined' && process.env?.RENDER_OWNER_ID) || '';\n\n if (!apiKey) {\n throw new Error(\n 'Missing Render API key. Provide apiKey in config or set RENDER_API_KEY environment variable.'\n );\n }\n\n if (!ownerId) {\n throw new Error(\n 'Missing Render Owner ID. Provide ownerId in config or set RENDER_OWNER_ID environment variable.'\n );\n }\n\n return { apiKey, ownerId };\n};\n\nexport const fetchRender = async (\n apiKey: string,\n endpoint: string,\n options: RequestInit = {}\n) => {\n const url = `https://api.render.com/v1${endpoint}`;\n const requestOptions = {\n method: 'GET',\n ...options,\n headers: {\n 'Accept': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n ...(options.headers || {})\n }\n };\n\n const response = await fetch(url, requestOptions);\n\n if (!response.ok) {\n throw new Error(`Render API error: ${response.status} ${response.statusText}`);\n }\n\n // Handle 204 No Content responses (like DELETE operations)\n if (response.status === 204) {\n return {};\n }\n\n return response.json();\n};\n\n/**\n * Convert daemon config to Render environment variables\n */\nfunction buildDaemonEnvVars(daemonConfig?: DaemonConfig): Record<string, string> {\n if (!daemonConfig) {\n return {};\n }\n\n return {\n COMPUTESDK_ACCESS_TOKEN: daemonConfig.accessToken,\n ...(daemonConfig.gatewayUrl && { COMPUTESDK_GATEWAY_URL: daemonConfig.gatewayUrl }),\n ...daemonConfig.env,\n };\n}\n\n/**\n * Render infrastructure provider\n *\n * Creates Render services with ComputeSDK daemon pre-installed via Docker image.\n */\nexport const render = defineInfraProvider<RenderInstance, RenderConfig>({\n name: 'render',\n\n methods: {\n create: async (config: RenderConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => {\n const { apiKey, ownerId } = getAndValidateCredentials(config);\n\n try {\n // Build environment variables for daemon\n const envVars = buildDaemonEnvVars(options?.daemonConfig);\n\n // Convert env vars to Render format\n const envVarsList = Object.entries(envVars).map(([key, value]) => ({\n key,\n value\n }));\n\n const createServiceData = {\n type: 'web_service',\n autoDeploy: 'yes',\n image: {\n ownerId: ownerId,\n imagePath: options?.image ?? 'computesdk/compute:latest'\n },\n serviceDetails: {\n runtime: 'image',\n // envSpecificDetails omitted to use image's default CMD/ENTRYPOINT (daemon startup)\n pullRequestPreviewsEnabled: 'no',\n ...(envVarsList.length > 0 && {\n envVars: envVarsList\n })\n },\n ownerId: ownerId,\n name: `computesdk-${Date.now()}`\n };\n\n const responseData = await fetchRender(apiKey, '/services', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(createServiceData)\n });\n\n if (!responseData) {\n throw new Error('No service returned from Render API - responseData is undefined');\n }\n\n // Render API returns { service: { id: \"...\", ... }, deployId: \"...\" }\n const service = responseData.service;\n if (!service) {\n throw new Error('No service returned from Render API - responseData.service is undefined');\n }\n\n if (!service.id) {\n throw new Error(`Service ID is undefined. Full service object: ${JSON.stringify(service, null, 2)}`);\n }\n\n const instance: RenderInstance = {\n serviceId: service.id,\n ownerId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n } catch (error) {\n throw new Error(\n `Failed to create Render instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: RenderConfig, instanceId: string) => {\n const { apiKey, ownerId } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchRender(apiKey, `/services/${instanceId}`);\n\n if (!responseData.id) {\n throw new Error('Service data is missing from Render response');\n }\n\n const instance: RenderInstance = {\n serviceId: responseData.id,\n ownerId,\n };\n\n return {\n instance,\n instanceId: responseData.id\n };\n } catch (error) {\n // If it's a 404, return null to indicate service not found\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw new Error(\n `Failed to get Render instance: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n list: async (config: RenderConfig) => {\n const { apiKey, ownerId } = getAndValidateCredentials(config);\n\n try {\n const responseData = await fetchRender(apiKey, '/services?includePreviews=true');\n\n // Extract services from the array response - each item has a \"service\" property\n const items = responseData || [];\n\n return items.map((item: any) => {\n const service = item.service;\n const instance: RenderInstance = {\n serviceId: service.id,\n ownerId,\n };\n\n return {\n instance,\n instanceId: service.id\n };\n });\n } catch (error) {\n throw new Error(\n `Failed to list Render instances: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n destroy: async (config: RenderConfig, instanceId: string) => {\n const { apiKey } = getAndValidateCredentials(config);\n\n try {\n await fetchRender(apiKey, `/services/${instanceId}`, {\n method: 'DELETE'\n });\n } catch (error) {\n // For destroy operations, we log warnings rather than throwing\n // since the resource may already be gone\n console.warn(`Render destroy warning: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n },\n});\n"],"mappings":"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","names":["defineInfraProvider","getAndValidateCredentials","buildDaemonEnvVars"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/gateway",
3
- "version": "0.0.7",
3
+ "version": "0.1.0",
4
4
  "description": "Infrastructure provider implementations for ComputeSDK gateway server",
5
5
  "author": "ComputeSDK Team",
6
6
  "license": "MIT",
@@ -18,7 +18,7 @@
18
18
  "dist"
19
19
  ],
20
20
  "dependencies": {
21
- "@computesdk/provider": "1.0.13"
21
+ "@computesdk/provider": "1.0.14"
22
22
  },
23
23
  "keywords": [
24
24
  "computesdk",