@akashnetwork/chain-sdk 1.0.0-alpha.21 → 1.0.0-alpha.23

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.
Files changed (88) hide show
  1. package/README.md +42 -4
  2. package/dist/cjs/index.shared.cjs +1 -0
  3. package/dist/cjs/index.shared.cjs.map +2 -2
  4. package/dist/cjs/sdl/SDL/SDL.cjs +5 -3
  5. package/dist/cjs/sdl/SDL/SDL.cjs.map +2 -2
  6. package/dist/cjs/sdl/SDL/SdlValidationError.cjs.map +2 -2
  7. package/dist/cjs/sdl/index.cjs +6 -1
  8. package/dist/cjs/sdl/index.cjs.map +2 -2
  9. package/dist/cjs/sdl/manifest/generateManifest.cjs +241 -0
  10. package/dist/cjs/sdl/manifest/generateManifest.cjs.map +7 -0
  11. package/dist/cjs/sdl/manifest/generateManifestVersion.cjs +84 -0
  12. package/dist/cjs/sdl/manifest/generateManifestVersion.cjs.map +7 -0
  13. package/dist/cjs/sdl/manifest/manifestUtils.cjs +138 -0
  14. package/dist/cjs/sdl/manifest/manifestUtils.cjs.map +7 -0
  15. package/dist/cjs/sdl/types.cjs.map +1 -1
  16. package/dist/cjs/sdl/{SDL/utils.cjs.map → utils.cjs.map} +1 -1
  17. package/dist/cjs/sdl/{SDL/validateSDL → validateSDL}/validateSDL.cjs +20 -13
  18. package/dist/cjs/sdl/validateSDL/validateSDL.cjs.map +7 -0
  19. package/dist/cjs/sdl/{SDL/validateSDL → validateSDL}/validateSDLInput.cjs +84 -25
  20. package/dist/cjs/sdl/validateSDL/validateSDLInput.cjs.map +7 -0
  21. package/dist/cjs/utils/yaml.cjs +44 -0
  22. package/dist/cjs/utils/yaml.cjs.map +7 -0
  23. package/dist/esm/chunk-2XL6OX6E.js +1 -0
  24. package/dist/esm/chunk-2XL6OX6E.js.map +7 -0
  25. package/dist/esm/{chunk-K3L3J5XB.js → chunk-4D3QNKFB.js} +3 -3
  26. package/dist/esm/{chunk-DUCGLLTN.js → chunk-5DCYIWCG.js} +100 -100
  27. package/dist/esm/{chunk-DUCGLLTN.js.map → chunk-5DCYIWCG.js.map} +4 -4
  28. package/dist/esm/{chunk-BGBAJIKV.js → chunk-5YECXI3P.js} +2 -2
  29. package/dist/esm/{chunk-MEXNRJE4.js → chunk-BYQF33C6.js} +2 -2
  30. package/dist/esm/{chunk-R5DUC7IU.js → chunk-C7UQYVYH.js} +2 -2
  31. package/dist/esm/{chunk-726NIMPF.js → chunk-JISXXX24.js} +2 -2
  32. package/dist/esm/{chunk-XPLMSDXV.js → chunk-QSKWS3TI.js} +553 -78
  33. package/dist/esm/chunk-QSKWS3TI.js.map +7 -0
  34. package/dist/esm/{chunk-EYW7M3KV.js → chunk-SA4SEZ6F.js} +2 -2
  35. package/dist/esm/{chunk-ST2QQ72E.js → chunk-VRE72ZD5.js} +2 -2
  36. package/dist/esm/{chunk-A5CS5ZKQ.js → chunk-XFCN5LRY.js} +2 -2
  37. package/dist/esm/chunk-Z5KZUB7X.js +364 -0
  38. package/dist/esm/chunk-Z5KZUB7X.js.map +7 -0
  39. package/dist/esm/generated/protos/index.akash.v1.js +6 -6
  40. package/dist/esm/generated/protos/index.akash.v1beta4.js +14 -349
  41. package/dist/esm/generated/protos/index.akash.v1beta4.js.map +4 -4
  42. package/dist/esm/generated/protos/index.akash.v1beta5.js +5 -5
  43. package/dist/esm/generated/protos/index.provider.akash.v1.js +3 -3
  44. package/dist/esm/generated/protos/index.provider.akash.v2beta3.js +3 -2
  45. package/dist/esm/index.js +30 -4
  46. package/dist/esm/index.js.map +1 -1
  47. package/dist/esm/index.web.js +29 -3
  48. package/dist/esm/index.web.js.map +1 -1
  49. package/dist/esm/{query_akash-XTPHUGJZ.js → query_akash-4CTLBKZR.js} +4 -4
  50. package/dist/esm/{query_akash-IXSQT2VJ.js → query_akash-DJ7LTLRE.js} +5 -5
  51. package/dist/esm/{service_akash-YMJ4ZYYX.js → service_akash-AZFAYT7H.js} +4 -4
  52. package/dist/esm/{service_akash-2EBLHFIP.js → service_akash-VMU3LNBA.js} +4 -4
  53. package/dist/esm/{service_akash-AYYJKBHS.js → service_akash-WRGOVR7I.js} +4 -4
  54. package/dist/sdl-schema.yaml +12 -1
  55. package/dist/tsconfig.build.tsbuildinfo +1 -1
  56. package/dist/types/index.shared.d.ts +1 -0
  57. package/dist/types/sdl/SDL/SDL.d.ts +2 -0
  58. package/dist/types/sdl/SDL/SdlValidationError.d.ts +3 -0
  59. package/dist/types/sdl/index.d.ts +5 -2
  60. package/dist/types/sdl/manifest/generateManifest.d.ts +18 -0
  61. package/dist/types/sdl/manifest/generateManifestVersion.d.ts +3 -0
  62. package/dist/types/sdl/manifest/manifestUtils.d.ts +27 -0
  63. package/dist/types/sdl/types.d.ts +60 -0
  64. package/dist/types/sdl/{SDL/validateSDL → validateSDL}/validateSDL.d.ts +2 -2
  65. package/dist/types/sdl/{SDL/validateSDL → validateSDL}/validateSDLInput.d.ts +16 -0
  66. package/dist/types/utils/yaml.d.ts +38 -0
  67. package/package.json +1 -1
  68. package/dist/cjs/sdl/SDL/validateSDL/validateSDL.cjs.map +0 -7
  69. package/dist/cjs/sdl/SDL/validateSDL/validateSDLInput.cjs.map +0 -7
  70. package/dist/cjs/test.cjs +0 -192
  71. package/dist/cjs/test.cjs.map +0 -7
  72. package/dist/esm/chunk-XPLMSDXV.js.map +0 -7
  73. package/dist/types/test.d.ts +0 -1
  74. /package/dist/cjs/sdl/{SDL/utils.cjs → utils.cjs} +0 -0
  75. /package/dist/esm/{chunk-K3L3J5XB.js.map → chunk-4D3QNKFB.js.map} +0 -0
  76. /package/dist/esm/{chunk-BGBAJIKV.js.map → chunk-5YECXI3P.js.map} +0 -0
  77. /package/dist/esm/{chunk-MEXNRJE4.js.map → chunk-BYQF33C6.js.map} +0 -0
  78. /package/dist/esm/{chunk-R5DUC7IU.js.map → chunk-C7UQYVYH.js.map} +0 -0
  79. /package/dist/esm/{chunk-726NIMPF.js.map → chunk-JISXXX24.js.map} +0 -0
  80. /package/dist/esm/{chunk-EYW7M3KV.js.map → chunk-SA4SEZ6F.js.map} +0 -0
  81. /package/dist/esm/{chunk-ST2QQ72E.js.map → chunk-VRE72ZD5.js.map} +0 -0
  82. /package/dist/esm/{chunk-A5CS5ZKQ.js.map → chunk-XFCN5LRY.js.map} +0 -0
  83. /package/dist/esm/{query_akash-XTPHUGJZ.js.map → query_akash-4CTLBKZR.js.map} +0 -0
  84. /package/dist/esm/{query_akash-IXSQT2VJ.js.map → query_akash-DJ7LTLRE.js.map} +0 -0
  85. /package/dist/esm/{service_akash-YMJ4ZYYX.js.map → service_akash-AZFAYT7H.js.map} +0 -0
  86. /package/dist/esm/{service_akash-2EBLHFIP.js.map → service_akash-VMU3LNBA.js.map} +0 -0
  87. /package/dist/esm/{service_akash-AYYJKBHS.js.map → service_akash-WRGOVR7I.js.map} +0 -0
  88. /package/dist/types/sdl/{SDL/utils.d.ts → utils.d.ts} +0 -0
package/README.md CHANGED
@@ -249,9 +249,10 @@ Exactly the same `transportOptions` options can be passed to chain web sdk and t
249
249
  ### Stack Definition Language (SDL)
250
250
 
251
251
  ```typescript
252
- import { SDL } from "@akashnetwork/chain-sdk";
252
+ import { generateManifest, yaml, type SDLInput } from "@akashnetwork/chain-sdk";
253
253
 
254
- const yaml = `
254
+ // Install https://marketplace.visualstudio.com/items?itemName=brandonkal.yaml-embed for VSCode to highlight yaml in sdl variable
255
+ const sdl: SDLInput = yaml`
255
256
  version: "2.0"
256
257
  services:
257
258
  web:
@@ -263,8 +264,45 @@ services:
263
264
  - global: true
264
265
  `;
265
266
 
266
- const sdl = SDL.fromString(yaml);
267
- const manifest = sdl.manifest();
267
+ const manifest = generateManifest(sdl);
268
+ ```
269
+
270
+ `yaml` helper supports interpolation of simple and complex values. So, you can do this:
271
+
272
+ ```ts
273
+ const version = "2.1";
274
+ const expose = [
275
+ { port: 80, as: 80, to: [{ global: true }] }
276
+ ];
277
+ const pricing = {
278
+ web: { denom: "uakt", amount: 1000 }
279
+ };
280
+
281
+ const sdl: SDLInput = yaml`
282
+ version: ${version}
283
+ services:
284
+ web:
285
+ image: nginx
286
+ expose: ${expose}
287
+ profiles:
288
+ compute:
289
+ web:
290
+ resources:
291
+ cpu:
292
+ units: 0.5
293
+ memory:
294
+ size: 512Mi
295
+ storage:
296
+ size: 1Gi
297
+ placement:
298
+ dcloud:
299
+ pricing: ${pricing}
300
+ deployment:
301
+ web:
302
+ dcloud:
303
+ profile: web
304
+ count: 1
305
+ `;
268
306
  ```
269
307
 
270
308
  ### Contributing
@@ -17,4 +17,5 @@ var index_shared_exports = {};
17
17
  module.exports = __toCommonJS(index_shared_exports);
18
18
  __reExport(index_shared_exports, require("./sdl/index.cjs"), module.exports);
19
19
  __reExport(index_shared_exports, require("./network/index.cjs"), module.exports);
20
+ __reExport(index_shared_exports, require("./utils/yaml.cjs"), module.exports);
20
21
  //# sourceMappingURL=index.shared.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.shared.ts"],
4
- "sourcesContent": ["export * from \"./sdl/index.ts\";\nexport * from \"./network/index.ts\";\n"],
5
- "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,iCAAc,2BAAd;AACA,iCAAc,+BADd;",
4
+ "sourcesContent": ["export * from \"./sdl/index.ts\";\nexport * from \"./network/index.ts\";\nexport * from \"./utils/yaml.ts\";\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,iCAAc,2BAAd;AACA,iCAAc,+BADd;AAEA,iCAAc,4BAFd;",
6
6
  "names": []
7
7
  }
@@ -41,8 +41,8 @@ var import_js_yaml = __toESM(require("js-yaml"), 1);
41
41
  var import_json_stable_stringify = __toESM(require("json-stable-stringify"), 1);
42
42
  var import_config = require("../../network/config.cjs");
43
43
  var import_sizes = require("../sizes.cjs");
44
+ var import_validateSDL = require("../validateSDL/validateSDL.cjs");
44
45
  var import_SdlValidationError = require("./SdlValidationError.cjs");
45
- var import_validateSDL = require("./validateSDL/validateSDL.cjs");
46
46
  var _SDL_instances, escapeHtml_fn;
47
47
  const Endpoint_SHARED_HTTP = 0;
48
48
  const Endpoint_RANDOM_PORT = 1;
@@ -356,7 +356,8 @@ const _SDL = class _SDL {
356
356
  mount: params.storage[name].mount,
357
357
  readOnly: params.storage[name].readOnly || false
358
358
  };
359
- })
359
+ }),
360
+ ...params?.permissions ? { Permissions: params.permissions } : {}
360
361
  };
361
362
  }
362
363
  v3ManifestServiceParams(params) {
@@ -371,7 +372,8 @@ const _SDL = class _SDL {
371
372
  mount: params.storage[name]?.mount,
372
373
  readOnly: params.storage[name]?.readOnly || false
373
374
  };
374
- })
375
+ }),
376
+ ...params?.permissions ? { permissions: params.permissions } : {}
375
377
  };
376
378
  }
377
379
  v2ManifestService(placement, name, asString) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/sdl/SDL/SDL.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport YAML from \"js-yaml\";\nimport { default as stableStringify } from \"json-stable-stringify\";\n\nimport { MAINNET_ID } from \"../../network/config.ts\";\nimport type { NetworkId } from \"../../network/types.ts\";\nimport { convertCpuResourceString, convertResourceString } from \"../sizes.ts\";\nimport type {\n v2ComputeResources,\n v2Expose,\n v2ExposeTo,\n v2HTTPOptions,\n v2Manifest,\n v2ManifestService,\n v2ManifestServiceParams,\n v2ProfileCompute,\n v2ResourceCPU,\n v2ResourceMemory,\n v2ResourceStorage,\n v2ResourceStorageArray,\n v2Sdl,\n v2Service,\n v2ServiceExpose,\n v2ServiceExposeHttpOptions,\n v2ServiceParams,\n v2StorageAttributes,\n v3ComputeResources,\n v3DeploymentGroup,\n v3GPUAttributes,\n v3Manifest,\n v3ManifestService,\n v3ManifestServiceParams,\n v3ProfileCompute,\n v3ResourceGPU,\n v3Sdl,\n v3ServiceExpose,\n v3ServiceExposeHttpOptions } from \"../types.ts\";\nimport { SdlValidationError } from \"./SdlValidationError.ts\";\nimport type { SDLInput } from \"./validateSDL/validateSDL.ts\";\nimport { validateSDL } from \"./validateSDL/validateSDL.ts\";\n\nconst Endpoint_SHARED_HTTP = 0;\nconst Endpoint_RANDOM_PORT = 1;\nconst Endpoint_LEASED_IP = 2;\n\nfunction isArray<T>(obj: any): obj is Array<T> {\n return Array.isArray(obj);\n}\n\nfunction isString(str: any): str is string {\n return typeof str === \"string\";\n}\n\ntype NetworkVersion = \"beta2\" | \"beta3\";\n\n/**\n * SDL (Stack Definition Language) parser and validator\n * Handles parsing and validation of Akash deployment manifests\n *\n * @example\n * ```ts\n * import { SDL } from './SDL';\n *\n * const yaml = `\n * version: \"2.0\"\n * services:\n * web:\n * image: nginx\n * expose:\n * - port: 80\n * as: 80\n * to:\n * - global: true\n * `;\n *\n * // Parse SDL from YAML string\n * const sdl = SDL.fromString(yaml);\n *\n * // Get deployment manifest\n * const manifest = sdl.manifest();\n *\n * // Get deployment groups\n * const groups = sdl.groups();\n * ```\n */\nexport class SDL {\n /**\n * Creates an SDL instance from a YAML string.\n *\n * @param {string} yaml - The YAML string containing the SDL definition.\n * @param {NetworkVersion} [version=\"beta3\"] - The SDL version (beta2 or beta3).\n * @param {NetworkId} [networkId=MAINNET_ID] - The network ID to validate against.\n * @returns {SDL} An instance of the SDL class.\n *\n * @example\n * ```ts\n * const yaml = `\n * version: \"2.0\"\n * services:\n * web:\n * image: nginx\n * expose:\n * - port: 80\n * as: 80\n * to:\n * - global: true\n * `;\n * const sdl = SDL.fromString(yaml);\n * ```\n */\n static fromString(yaml: string, version: NetworkVersion = \"beta3\", networkId: NetworkId = MAINNET_ID): SDL {\n const data = YAML.load(yaml) as v3Sdl;\n return new SDL(data, version, networkId);\n }\n\n constructor(\n public readonly data: v2Sdl,\n public readonly version: NetworkVersion = \"beta2\",\n networkId: NetworkId = MAINNET_ID,\n ) {\n const errors = validateSDL(data as unknown as SDLInput, networkId);\n if (errors) throw new SdlValidationError(errors[0].message);\n }\n\n services() {\n if (this.data) {\n return this.data.services;\n }\n\n return {};\n }\n\n deployments() {\n if (this.data) {\n return this.data.deployment;\n }\n\n return {};\n }\n\n profiles() {\n if (this.data) {\n return this.data.profiles;\n }\n\n return {};\n }\n\n placements() {\n const { placement } = this.data.profiles;\n\n return placement || {};\n }\n\n serviceNames() {\n const names = this.data ? Object.keys(this.data.services) : [];\n\n // TODO: sort these\n return names;\n }\n\n deploymentsByPlacement(placement: string) {\n const deployments = this.data ? this.data.deployment : [];\n\n return Object.entries(deployments as object).filter(({ 1: deployment }) => Object.prototype.hasOwnProperty.call(deployment, placement));\n }\n\n resourceUnit(val: string, asString: boolean) {\n return asString ? { val: `${convertResourceString(val)}` } : { val: convertResourceString(val) };\n }\n\n resourceValue(value: { toString: () => string } | null, asString: boolean) {\n if (value === null) {\n return value;\n }\n\n const strVal = value.toString();\n const encoder = new TextEncoder();\n\n return asString ? strVal : encoder.encode(strVal);\n }\n\n serviceResourceCpu(resource: v2ResourceCPU) {\n const units = isString(resource.units) ? convertCpuResourceString(resource.units) : resource.units * 1000;\n\n return resource.attributes\n ? {\n units: { val: `${units}` },\n attributes: this.serviceResourceAttributes(resource.attributes),\n }\n : {\n units: { val: `${units}` },\n };\n }\n\n serviceResourceMemory(resource: v2ResourceMemory, asString: boolean) {\n const key = asString ? \"quantity\" : \"size\";\n\n return resource.attributes\n ? {\n [key]: this.resourceUnit(resource.size, asString),\n attributes: this.serviceResourceAttributes(resource.attributes),\n }\n : {\n [key]: this.resourceUnit(resource.size, asString),\n };\n }\n\n serviceResourceStorage(resource: v2ResourceStorageArray | v2ResourceStorage, asString: boolean) {\n const key = asString ? \"quantity\" : \"size\";\n const storage = isArray(resource) ? resource : [resource];\n\n return storage.map((storage) =>\n storage.attributes\n ? {\n name: storage.name || \"default\",\n [key]: this.resourceUnit(storage.size, asString),\n attributes: this.serviceResourceStorageAttributes(storage.attributes),\n }\n : {\n name: storage.name || \"default\",\n [key]: this.resourceUnit(storage.size, asString),\n },\n );\n }\n\n serviceResourceAttributes(attributes?: Record<string, any>) {\n return (\n attributes\n && Object.keys(attributes)\n .sort()\n .map((key) => ({ key, value: attributes[key].toString() }))\n );\n }\n\n serviceResourceStorageAttributes(attributes?: v2StorageAttributes) {\n if (!attributes) return undefined;\n\n const pairs = Object.keys(attributes).map((key) => ({ key, value: attributes[key].toString() }));\n\n if (attributes.class === \"ram\" && !(\"persistent\" in attributes)) {\n pairs.push({ key: \"persistent\", value: \"false\" });\n }\n\n pairs.sort((a, b) => a.key.localeCompare(b.key));\n\n return pairs;\n }\n\n serviceResourceGpu(resource: v3ResourceGPU | undefined, asString: boolean) {\n const value = resource?.units || 0;\n const numVal = isString(value) ? Buffer.from(value, \"ascii\") : value;\n const strVal = !isString(value) ? value.toString() : value;\n\n return resource?.attributes\n ? {\n units: asString ? { val: strVal } : { val: numVal },\n attributes: this.transformGpuAttributes(resource?.attributes),\n }\n : {\n units: asString ? { val: strVal } : { val: numVal },\n };\n }\n\n v2ServiceResourceEndpoints(service: v2Service) {\n const endpointSequenceNumbers = this.computeEndpointSequenceNumbers(this.data);\n const endpoints = service.expose.flatMap((expose) =>\n expose.to\n ? expose.to\n .filter((to) => to.global && to.ip?.length > 0)\n .map((to) => ({\n kind: Endpoint_LEASED_IP,\n sequence_number: endpointSequenceNumbers[to.ip] || 0,\n }))\n : [],\n );\n\n return endpoints.length > 0 ? endpoints : null;\n }\n\n v3ServiceResourceEndpoints(service: v2Service) {\n const endpointSequenceNumbers = this.computeEndpointSequenceNumbers(this.data);\n const endpoints = service.expose.flatMap((expose) =>\n expose.to\n ? expose.to\n .filter((to) => to.global)\n .flatMap((to) => {\n const exposeSpec = {\n port: expose.port,\n externalPort: expose.as || 0,\n proto: this.parseServiceProto(expose.proto),\n global: !!to.global,\n };\n\n const kind = this.exposeShouldBeIngress(exposeSpec) ? Endpoint_SHARED_HTTP : Endpoint_RANDOM_PORT;\n\n const defaultEp = kind !== 0 ? { kind: kind, sequence_number: 0 } : { sequence_number: 0 };\n\n const leasedEp\n = to.ip?.length > 0\n ? {\n kind: Endpoint_LEASED_IP,\n sequence_number: endpointSequenceNumbers[to.ip] || 0,\n }\n : undefined;\n\n return leasedEp ? [defaultEp, leasedEp] : [defaultEp];\n })\n : [],\n );\n\n return endpoints;\n }\n\n serviceResourcesBeta2(profile: v2ProfileCompute, service: v2Service, asString: boolean = false) {\n return {\n cpu: this.serviceResourceCpu(profile.resources.cpu),\n memory: this.serviceResourceMemory(profile.resources.memory, asString),\n storage: this.serviceResourceStorage(profile.resources.storage, asString),\n endpoints: this.v2ServiceResourceEndpoints(service),\n };\n }\n\n serviceResourcesBeta3(id: number, profile: v3ProfileCompute, service: v2Service, asString: boolean = false) {\n return {\n id: id,\n cpu: this.serviceResourceCpu(profile.resources.cpu),\n memory: this.serviceResourceMemory(profile.resources.memory, asString),\n storage: this.serviceResourceStorage(profile.resources.storage, asString),\n gpu: this.serviceResourceGpu(profile.resources.gpu, asString),\n endpoints: this.v3ServiceResourceEndpoints(service),\n };\n }\n\n /**\n * Parses the service protocol.\n *\n * @param proto - The protocol string (e.g., \"TCP\", \"UDP\").\n * @returns The parsed protocol.\n * @throws Will throw an error if the protocol is unsupported.\n *\n * @example\n * ```ts\n * const protocol = SDL.parseServiceProto(\"TCP\");\n * // protocol is \"TCP\"\n * ```\n */\n parseServiceProto(proto?: string): string {\n const raw = proto?.toUpperCase() || \"TCP\";\n if (raw === \"TCP\" || raw === \"UDP\") return raw;\n\n throw new SdlValidationError(`Unsupported service protocol: \"${proto}\". Supported protocols are \"TCP\" and \"UDP\".`);\n }\n\n manifestExposeService(to: v2ExposeTo) {\n return to.service || \"\";\n }\n\n manifestExposeGlobal(to: v2ExposeTo) {\n return to.global || false;\n }\n\n manifestExposeHosts(expose: v2Expose) {\n return expose.accept || null;\n }\n\n v2HttpOptions(http_options: v2HTTPOptions | undefined) {\n const defaults = {\n MaxBodySize: 1048576,\n ReadTimeout: 60000,\n SendTimeout: 60000,\n NextTries: 3,\n NextTimeout: 0,\n NextCases: [\"error\", \"timeout\"],\n };\n\n if (!http_options) {\n return { ...defaults };\n }\n\n return {\n MaxBodySize: http_options.max_body_size || defaults.MaxBodySize,\n ReadTimeout: http_options.read_timeout || defaults.ReadTimeout,\n SendTimeout: http_options.send_timeout || defaults.SendTimeout,\n NextTries: http_options.next_tries || defaults.NextTries,\n NextTimeout: http_options.next_timeout || defaults.NextTimeout,\n NextCases: http_options.next_cases || defaults.NextCases,\n };\n }\n\n v3HttpOptions(http_options: v2HTTPOptions | undefined) {\n const defaults = {\n maxBodySize: 1048576,\n readTimeout: 60000,\n sendTimeout: 60000,\n nextTries: 3,\n nextTimeout: 0,\n nextCases: [\"error\", \"timeout\"],\n };\n\n if (!http_options) {\n return { ...defaults };\n }\n\n return {\n maxBodySize: http_options.max_body_size || defaults.maxBodySize,\n readTimeout: http_options.read_timeout || defaults.readTimeout,\n sendTimeout: http_options.send_timeout || defaults.sendTimeout,\n nextTries: http_options.next_tries || defaults.nextTries,\n nextTimeout: http_options.next_timeout || defaults.nextTimeout,\n nextCases: http_options.next_cases || defaults.nextCases,\n };\n }\n\n v2ManifestExposeHttpOptions(expose: v2Expose): v2ServiceExposeHttpOptions {\n return this.v2HttpOptions(expose.http_options);\n }\n\n v3ManifestExposeHttpOptions(expose: v2Expose): v3ServiceExposeHttpOptions {\n return this.v3HttpOptions(expose.http_options);\n }\n\n v2ManifestExpose(service: v2Service): v2ServiceExpose[] {\n const endpointSequenceNumbers = this.computeEndpointSequenceNumbers(this.data);\n return service.expose.flatMap((expose) =>\n expose.to\n ? expose.to.map((to) => ({\n Port: expose.port,\n ExternalPort: expose.as || 0,\n Proto: this.parseServiceProto(expose.proto),\n Service: this.manifestExposeService(to),\n Global: this.manifestExposeGlobal(to),\n Hosts: this.manifestExposeHosts(expose),\n HTTPOptions: this.v2ManifestExposeHttpOptions(expose),\n IP: to.ip || \"\",\n EndpointSequenceNumber: endpointSequenceNumbers[to.ip] || 0,\n }))\n : [],\n );\n }\n\n v3ManifestExpose(service: v2Service): v3ServiceExpose[] {\n const endpointSequenceNumbers = this.computeEndpointSequenceNumbers(this.data);\n return service.expose\n .flatMap((expose) =>\n expose.to\n ? expose.to.map((to) => ({\n port: expose.port,\n externalPort: expose.as || 0,\n proto: this.parseServiceProto(expose.proto),\n service: this.manifestExposeService(to),\n global: this.manifestExposeGlobal(to),\n hosts: this.manifestExposeHosts(expose),\n httpOptions: this.v3ManifestExposeHttpOptions(expose),\n ip: to.ip || \"\",\n endpointSequenceNumber: endpointSequenceNumbers[to.ip] || 0,\n }))\n : [],\n )\n .sort((a, b) => {\n if (a.service != b.service) return a.service.localeCompare(b.service);\n if (a.port != b.port) return a.port - b.port;\n if (a.proto != b.proto) return a.proto.localeCompare(b.proto);\n if (a.global != b.global) return a.global ? -1 : 1;\n\n return 0;\n });\n }\n\n v2ManifestServiceParams(params: v2ServiceParams): v2ManifestServiceParams | undefined {\n return {\n Storage: Object.keys(params?.storage ?? {}).map((name) => {\n if (!params?.storage) throw new Error(\"Storage is undefined\");\n return {\n name: name,\n mount: params.storage[name].mount,\n readOnly: params.storage[name].readOnly || false,\n };\n }),\n };\n }\n\n v3ManifestServiceParams(params: v2ServiceParams | undefined): v3ManifestServiceParams | null {\n if (params === undefined) {\n return null;\n }\n\n return {\n storage: Object.keys(params?.storage ?? {}).map((name) => {\n if (!params?.storage) throw new Error(\"Storage is undefined\");\n return {\n name: name,\n mount: params.storage[name]?.mount,\n readOnly: params.storage[name]?.readOnly || false,\n };\n }),\n };\n }\n\n v2ManifestService(placement: string, name: string, asString: boolean): v2ManifestService {\n const service = this.data.services[name];\n const deployment = this.data.deployment[name];\n const profile = this.data.profiles.compute[deployment[placement].profile];\n\n const manifestService: v2ManifestService = {\n Name: name,\n Image: service.image,\n Command: service.command || null,\n Args: service.args || null,\n Env: service.env || null,\n Resources: this.serviceResourcesBeta2(profile, service, asString),\n Count: deployment[placement].count,\n Expose: this.v2ManifestExpose(service),\n };\n\n if (service.params) {\n manifestService.params = this.v2ManifestServiceParams(service.params);\n }\n\n return manifestService;\n }\n\n v3ManifestService(id: number, placement: string, name: string, asString: boolean): v3ManifestService {\n const service = this.data.services[name];\n const deployment = this.data.deployment[name];\n const profile = this.data.profiles.compute[deployment[placement].profile];\n const credentials = service.credentials || null;\n\n if (credentials && !credentials.email) {\n credentials.email = \"\";\n }\n\n const manifestService: v3ManifestService = {\n name: name,\n image: service.image,\n command: service.command || null,\n args: service.args || null,\n env: service.env || null,\n resources: this.serviceResourcesBeta3(id, profile as v3ProfileCompute, service, asString),\n count: deployment[placement].count,\n expose: this.v3ManifestExpose(service),\n params: this.v3ManifestServiceParams(service.params),\n credentials,\n };\n\n if (!manifestService.params) {\n delete manifestService.params;\n }\n\n return manifestService;\n }\n\n v2Manifest(asString: boolean = false): v2Manifest {\n return Object.keys(this.placements()).map((name) => ({\n Name: name,\n Services: this.deploymentsByPlacement(name).map(([service]) => this.v2ManifestService(name, service, asString)),\n }));\n }\n\n v3Manifest(asString: boolean = false): v3Manifest {\n const groups = this.v3Groups();\n const serviceId = (pIdx: number, sIdx: number) => groups[pIdx].resources[sIdx].resource.id;\n\n return Object.keys(this.placements()).map((name, pIdx) => ({\n name: name,\n services: this.deploymentsByPlacement(name)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([service], idx) => this.v3ManifestService(serviceId(pIdx, idx), name, service, asString)),\n }));\n }\n\n manifest(asString: boolean = false): v2Manifest | v3Manifest {\n return this.version === \"beta2\" ? this.v2Manifest(asString) : this.v3Manifest(asString);\n }\n\n /**\n * Computes the endpoint sequence numbers for the given SDL.\n *\n * @param sdl - The SDL data.\n * @returns An object mapping IPs to their sequence numbers.\n *\n * @example\n * ```ts\n * const sequenceNumbers = sdl.computeEndpointSequenceNumbers(sdlData);\n * // sequenceNumbers might be { \"192.168.1.1\": 1, \"192.168.1.2\": 2 }\n * ```\n */\n computeEndpointSequenceNumbers(sdl: v2Sdl) {\n return Object.fromEntries(\n Object.values(sdl.services).flatMap((service) =>\n service.expose.flatMap((expose) =>\n expose.to\n ? expose.to\n .filter((to) => to.global && to.ip?.length > 0)\n .map((to) => to.ip)\n .sort()\n .map((ip, index) => [ip, index + 1])\n : [],\n ),\n ),\n );\n }\n\n resourceUnitCpu(computeResources: v2ComputeResources, asString: boolean) {\n const attributes = computeResources.cpu.attributes;\n const cpu = isString(computeResources.cpu.units) ? convertCpuResourceString(computeResources.cpu.units) : computeResources.cpu.units * 1000;\n\n return {\n units: { val: this.resourceValue(cpu, asString) },\n attributes:\n attributes\n && Object.entries(attributes)\n .sort(([k0], [k1]) => k0.localeCompare(k1))\n .map(([key, value]) => ({\n key: key,\n value: value.toString(),\n })),\n };\n }\n\n resourceUnitMemory(computeResources: v2ComputeResources, asString: boolean) {\n const attributes = computeResources.memory.attributes;\n\n return {\n quantity: {\n val: this.resourceValue(convertResourceString(computeResources.memory.size), asString),\n },\n attributes:\n attributes\n && Object.entries(attributes)\n .sort(([k0], [k1]) => k0.localeCompare(k1))\n .map(([key, value]) => ({\n key: key,\n value: value.toString(),\n })),\n };\n }\n\n resourceUnitStorage(computeResources: v2ComputeResources, asString: boolean) {\n const storages = isArray(computeResources.storage) ? computeResources.storage : [computeResources.storage];\n\n return storages.map((storage) => ({\n name: storage.name || \"default\",\n quantity: {\n val: this.resourceValue(convertResourceString(storage.size), asString),\n },\n attributes: this.serviceResourceStorageAttributes(storage.attributes),\n }));\n }\n\n transformGpuAttributes(attributes: v3GPUAttributes): Array<{ key: string; value: string }> {\n return Object.entries(attributes.vendor).flatMap(([vendor, models]) =>\n models\n ? models.map((model) => {\n let key = `vendor/${vendor}/model/${model.model}`;\n\n if (model.ram) {\n key += `/ram/${model.ram}`;\n }\n\n if (model.interface) {\n key += `/interface/${model.interface}`;\n }\n\n return {\n key: key,\n value: \"true\",\n };\n })\n : [\n {\n key: `vendor/${vendor}/model/*`,\n value: \"true\",\n },\n ],\n );\n }\n\n resourceUnitGpu(computeResources: v3ComputeResources, asString: boolean) {\n const attributes = computeResources.gpu?.attributes;\n const units = computeResources.gpu?.units || \"0\";\n const gpu = isString(units) ? parseInt(units) : units;\n\n return {\n units: { val: this.resourceValue(gpu, asString) },\n attributes: attributes && this.transformGpuAttributes(attributes),\n };\n }\n\n groupResourceUnits(resource: v2ComputeResources | undefined, asString: boolean) {\n if (!resource) return {};\n\n const units = {\n endpoints: null,\n } as any;\n\n if (resource.cpu) {\n units.cpu = this.resourceUnitCpu(resource, asString);\n }\n\n if (resource.memory) {\n units.memory = this.resourceUnitMemory(resource, asString);\n }\n\n if (resource.storage) {\n units.storage = this.resourceUnitStorage(resource, asString);\n }\n\n if (this.version === \"beta3\") {\n units.gpu = this.resourceUnitGpu(resource as v3ComputeResources, asString);\n }\n\n return units;\n }\n\n exposeShouldBeIngress(expose: { proto: string; global: boolean; externalPort: number; port: number }) {\n const externalPort = expose.externalPort === 0 ? expose.port : expose.externalPort;\n\n return expose.global && expose.proto === \"TCP\" && externalPort === 80;\n }\n\n groups() {\n return this.version === \"beta2\" ? this.v2Groups() : this.v3Groups();\n }\n\n v3Groups() {\n const groups = new Map<\n string,\n {\n dgroup: v3DeploymentGroup;\n boundComputes: Record<string, Record<string, number>>;\n }\n >();\n const services = Object.entries(this.data.services).sort(([a], [b]) => a.localeCompare(b));\n\n for (const [svcName, service] of services) {\n for (const [placementName, svcdepl] of Object.entries(this.data.deployment[svcName])) {\n // objects below have been ensured to exist\n const compute = this.data.profiles.compute[svcdepl.profile];\n const infra = this.data.profiles.placement[placementName];\n const pricing = infra.pricing[svcdepl.profile];\n const price = {\n ...pricing,\n amount: pricing.amount?.toString(),\n };\n\n let group = groups.get(placementName);\n\n if (!group) {\n const attributes = (infra.attributes\n ? Object.entries(infra.attributes).map(([key, value]) => ({\n key,\n value,\n }))\n : []) as unknown as Array<{ key: string; value: string }>;\n\n attributes.sort((a, b) => a.key.localeCompare(b.key));\n\n group = {\n dgroup: {\n name: placementName,\n resources: [],\n requirements: {\n attributes: attributes,\n signedBy: {\n allOf: infra.signedBy?.allOf || [],\n anyOf: infra.signedBy?.anyOf || [],\n },\n },\n },\n boundComputes: {},\n };\n\n groups.set(placementName, group);\n }\n\n if (!group.boundComputes[placementName]) {\n group.boundComputes[placementName] = {};\n }\n\n // const resources = this.serviceResourcesBeta3(0, compute as v3ProfileCompute, service, false);\n const location = group.boundComputes[placementName][svcdepl.profile];\n\n if (!location) {\n const res = this.groupResourceUnits(compute.resources, false);\n res.endpoints = this.v3ServiceResourceEndpoints(service);\n\n const resID = group.dgroup.resources.length > 0 ? group.dgroup.resources.length + 1 : 1;\n res.id = resID;\n // resources.id = res.id;\n\n group.dgroup.resources.push({\n resource: res,\n price: price,\n count: svcdepl.count,\n } as any);\n\n group.boundComputes[placementName][svcdepl.profile] = group.dgroup.resources.length - 1;\n } else {\n const endpoints = this.v3ServiceResourceEndpoints(service);\n // resources.id = group.dgroup.resources[location].id;\n\n group.dgroup.resources[location].count += svcdepl.count;\n group.dgroup.resources[location].endpoints += endpoints as any;\n group.dgroup.resources[location].endpoints.sort();\n }\n }\n }\n\n // keep ordering stable\n const names: string[] = [...groups.keys()].sort();\n return names.map((name) => groups.get(name)).map((group) => (group ? (group.dgroup as typeof group.dgroup) : {})) as Array<v3DeploymentGroup>;\n }\n\n v2Groups() {\n const yamlJson = this.data;\n const ipEndpointNames = this.computeEndpointSequenceNumbers(yamlJson);\n\n const groups = {} as any;\n\n Object.keys(yamlJson.services).forEach((svcName) => {\n const svc = yamlJson.services[svcName];\n const depl = yamlJson.deployment[svcName];\n\n Object.keys(depl).forEach((placementName) => {\n const svcdepl = depl[placementName];\n const compute = yamlJson.profiles.compute[svcdepl.profile];\n const infra = yamlJson.profiles.placement[placementName];\n\n const pricing = infra.pricing[svcdepl.profile];\n const price = {\n ...pricing,\n amount: pricing.amount.toString(),\n };\n\n let group = groups[placementName];\n\n if (!group) {\n group = {\n name: placementName,\n requirements: {\n attributes: infra.attributes\n ? Object.entries(infra.attributes).map(([key, value]) => ({\n key,\n value,\n }))\n : [],\n signedBy: {\n allOf: infra.signedBy?.allOf || [],\n anyOf: infra.signedBy?.anyOf || [],\n },\n },\n resources: [],\n };\n\n if (group.requirements.attributes) {\n group.requirements.attributes = group.requirements.attributes.sort((a: any, b: any) => a.key < b.key);\n }\n\n groups[group.name] = group;\n }\n\n const resources = {\n resources: this.groupResourceUnits(compute.resources, false), // Changed resources => unit\n price: price,\n count: svcdepl.count,\n };\n\n const endpoints = [] as any[];\n svc?.expose?.forEach((expose) => {\n expose?.to\n ?.filter((to) => to.global)\n .forEach((to) => {\n const exposeSpec = {\n port: expose.port,\n externalPort: expose.as || 0,\n proto: this.parseServiceProto(expose.proto),\n global: !!to.global,\n };\n\n if (to.ip?.length > 0) {\n const seqNo = ipEndpointNames[to.ip];\n endpoints.push({\n kind: Endpoint_LEASED_IP,\n sequence_number: seqNo,\n });\n }\n\n const kind = this.exposeShouldBeIngress(exposeSpec) ? Endpoint_SHARED_HTTP : Endpoint_RANDOM_PORT;\n\n endpoints.push({ kind: kind, sequence_number: 0 });\n });\n });\n\n resources.resources.endpoints = endpoints;\n group.resources.push(resources);\n });\n });\n\n return Object.keys(groups)\n .sort((a, b) => (a < b ? 1 : 0))\n .map((name) => groups[name]);\n }\n\n /**\n * Escapes HTML characters in a string.\n *\n * @param raw - The raw string to escape.\n * @returns The escaped string.\n *\n * @example\n * ```ts\n * const escaped = sdl.escapeHtml(\"<div>Hello</div>\");\n * // escaped is \"\\\\u003cdiv\\\\u003eHello\\\\u003c/div\\\\u003e\"\n * ```\n */\n #escapeHtml(raw: string) {\n return raw.replace(/</g, \"\\\\u003c\").replace(/>/g, \"\\\\u003e\").replace(/&/g, \"\\\\u0026\");\n }\n\n manifestSortedJSON() {\n const manifest = this.manifest(true);\n let jsonStr = JSON.stringify(manifest);\n\n if (jsonStr) {\n jsonStr = jsonStr.replaceAll(\"\\\"quantity\\\":{\\\"val\", \"\\\"size\\\":{\\\"val\");\n }\n\n return this.#escapeHtml(stableStringify(JSON.parse(jsonStr)) || \"\");\n }\n\n async manifestVersion() {\n const jsonStr = this.manifestSortedJSON();\n const enc = new TextEncoder();\n const sortedBytes = enc.encode(jsonStr);\n const sum = await crypto.subtle.digest(\"SHA-256\", sortedBytes);\n\n return new Uint8Array(sum);\n }\n\n manifestSorted() {\n const sorted = this.manifestSortedJSON();\n return JSON.parse(sorted);\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport YAML from \"js-yaml\";\nimport { default as stableStringify } from \"json-stable-stringify\";\n\nimport { MAINNET_ID } from \"../../network/config.ts\";\nimport type { NetworkId } from \"../../network/types.ts\";\nimport { convertCpuResourceString, convertResourceString } from \"../sizes.ts\";\nimport type {\n v2ComputeResources,\n v2Expose,\n v2ExposeTo,\n v2HTTPOptions,\n v2Manifest,\n v2ManifestService,\n v2ManifestServiceParams,\n v2ProfileCompute,\n v2ResourceCPU,\n v2ResourceMemory,\n v2ResourceStorage,\n v2ResourceStorageArray,\n v2Sdl,\n v2Service,\n v2ServiceExpose,\n v2ServiceExposeHttpOptions,\n v2ServiceParams,\n v2StorageAttributes,\n v3ComputeResources,\n v3DeploymentGroup,\n v3GPUAttributes,\n v3Manifest,\n v3ManifestService,\n v3ManifestServiceParams,\n v3ProfileCompute,\n v3ResourceGPU,\n v3Sdl,\n v3ServiceExpose,\n v3ServiceExposeHttpOptions } from \"../types.ts\";\nimport type { SDLInput } from \"../validateSDL/validateSDL.ts\";\nimport { validateSDL } from \"../validateSDL/validateSDL.ts\";\nimport { SdlValidationError } from \"./SdlValidationError.ts\";\n\nconst Endpoint_SHARED_HTTP = 0;\nconst Endpoint_RANDOM_PORT = 1;\nconst Endpoint_LEASED_IP = 2;\n\nfunction isArray<T>(obj: any): obj is Array<T> {\n return Array.isArray(obj);\n}\n\nfunction isString(str: any): str is string {\n return typeof str === \"string\";\n}\n\ntype NetworkVersion = \"beta2\" | \"beta3\";\n\n/**\n * SDL (Stack Definition Language) parser and validator\n * Handles parsing and validation of Akash deployment manifests\n *\n * @deprecated Use `generateManifest` instead.\n *\n * @example\n * ```ts\n * import { SDL } from './SDL';\n *\n * const yaml = `\n * version: \"2.0\"\n * services:\n * web:\n * image: nginx\n * expose:\n * - port: 80\n * as: 80\n * to:\n * - global: true\n * `;\n *\n * // Parse SDL from YAML string\n * const sdl = SDL.fromString(yaml);\n *\n * // Get deployment manifest\n * const manifest = sdl.manifest();\n *\n * // Get deployment groups\n * const groups = sdl.groups();\n * ```\n */\nexport class SDL {\n /**\n * Creates an SDL instance from a YAML string.\n *\n * @param {string} yaml - The YAML string containing the SDL definition.\n * @param {NetworkVersion} [version=\"beta3\"] - The SDL version (beta2 or beta3).\n * @param {NetworkId} [networkId=MAINNET_ID] - The network ID to validate against.\n * @returns {SDL} An instance of the SDL class.\n *\n * @example\n * ```ts\n * const yaml = `\n * version: \"2.0\"\n * services:\n * web:\n * image: nginx\n * expose:\n * - port: 80\n * as: 80\n * to:\n * - global: true\n * `;\n * const sdl = SDL.fromString(yaml);\n * ```\n */\n static fromString(yaml: string, version: NetworkVersion = \"beta3\", networkId: NetworkId = MAINNET_ID): SDL {\n const data = YAML.load(yaml) as v3Sdl;\n return new SDL(data, version, networkId);\n }\n\n constructor(\n public readonly data: v2Sdl,\n public readonly version: NetworkVersion = \"beta2\",\n networkId: NetworkId = MAINNET_ID,\n ) {\n const errors = validateSDL(data as unknown as SDLInput, networkId);\n if (errors) throw new SdlValidationError(errors[0].message);\n }\n\n services() {\n if (this.data) {\n return this.data.services;\n }\n\n return {};\n }\n\n deployments() {\n if (this.data) {\n return this.data.deployment;\n }\n\n return {};\n }\n\n profiles() {\n if (this.data) {\n return this.data.profiles;\n }\n\n return {};\n }\n\n placements() {\n const { placement } = this.data.profiles;\n\n return placement || {};\n }\n\n serviceNames() {\n const names = this.data ? Object.keys(this.data.services) : [];\n\n // TODO: sort these\n return names;\n }\n\n deploymentsByPlacement(placement: string) {\n const deployments = this.data ? this.data.deployment : [];\n\n return Object.entries(deployments as object).filter(({ 1: deployment }) => Object.prototype.hasOwnProperty.call(deployment, placement));\n }\n\n resourceUnit(val: string, asString: boolean) {\n return asString ? { val: `${convertResourceString(val)}` } : { val: convertResourceString(val) };\n }\n\n resourceValue(value: { toString: () => string } | null, asString: boolean) {\n if (value === null) {\n return value;\n }\n\n const strVal = value.toString();\n const encoder = new TextEncoder();\n\n return asString ? strVal : encoder.encode(strVal);\n }\n\n serviceResourceCpu(resource: v2ResourceCPU) {\n const units = isString(resource.units) ? convertCpuResourceString(resource.units) : resource.units * 1000;\n\n return resource.attributes\n ? {\n units: { val: `${units}` },\n attributes: this.serviceResourceAttributes(resource.attributes),\n }\n : {\n units: { val: `${units}` },\n };\n }\n\n serviceResourceMemory(resource: v2ResourceMemory, asString: boolean) {\n const key = asString ? \"quantity\" : \"size\";\n\n return resource.attributes\n ? {\n [key]: this.resourceUnit(resource.size, asString),\n attributes: this.serviceResourceAttributes(resource.attributes),\n }\n : {\n [key]: this.resourceUnit(resource.size, asString),\n };\n }\n\n serviceResourceStorage(resource: v2ResourceStorageArray | v2ResourceStorage, asString: boolean) {\n const key = asString ? \"quantity\" : \"size\";\n const storage = isArray(resource) ? resource : [resource];\n\n return storage.map((storage) =>\n storage.attributes\n ? {\n name: storage.name || \"default\",\n [key]: this.resourceUnit(storage.size, asString),\n attributes: this.serviceResourceStorageAttributes(storage.attributes),\n }\n : {\n name: storage.name || \"default\",\n [key]: this.resourceUnit(storage.size, asString),\n },\n );\n }\n\n serviceResourceAttributes(attributes?: Record<string, any>) {\n return (\n attributes\n && Object.keys(attributes)\n .sort()\n .map((key) => ({ key, value: attributes[key].toString() }))\n );\n }\n\n serviceResourceStorageAttributes(attributes?: v2StorageAttributes) {\n if (!attributes) return undefined;\n\n const pairs = Object.keys(attributes).map((key) => ({ key, value: attributes[key].toString() }));\n\n if (attributes.class === \"ram\" && !(\"persistent\" in attributes)) {\n pairs.push({ key: \"persistent\", value: \"false\" });\n }\n\n pairs.sort((a, b) => a.key.localeCompare(b.key));\n\n return pairs;\n }\n\n serviceResourceGpu(resource: v3ResourceGPU | undefined, asString: boolean) {\n const value = resource?.units || 0;\n const numVal = isString(value) ? Buffer.from(value, \"ascii\") : value;\n const strVal = !isString(value) ? value.toString() : value;\n\n return resource?.attributes\n ? {\n units: asString ? { val: strVal } : { val: numVal },\n attributes: this.transformGpuAttributes(resource?.attributes),\n }\n : {\n units: asString ? { val: strVal } : { val: numVal },\n };\n }\n\n v2ServiceResourceEndpoints(service: v2Service) {\n const endpointSequenceNumbers = this.computeEndpointSequenceNumbers(this.data);\n const endpoints = service.expose.flatMap((expose) =>\n expose.to\n ? expose.to\n .filter((to) => to.global && to.ip?.length > 0)\n .map((to) => ({\n kind: Endpoint_LEASED_IP,\n sequence_number: endpointSequenceNumbers[to.ip] || 0,\n }))\n : [],\n );\n\n return endpoints.length > 0 ? endpoints : null;\n }\n\n v3ServiceResourceEndpoints(service: v2Service) {\n const endpointSequenceNumbers = this.computeEndpointSequenceNumbers(this.data);\n const endpoints = service.expose.flatMap((expose) =>\n expose.to\n ? expose.to\n .filter((to) => to.global)\n .flatMap((to) => {\n const exposeSpec = {\n port: expose.port,\n externalPort: expose.as || 0,\n proto: this.parseServiceProto(expose.proto),\n global: !!to.global,\n };\n\n const kind = this.exposeShouldBeIngress(exposeSpec) ? Endpoint_SHARED_HTTP : Endpoint_RANDOM_PORT;\n\n const defaultEp = kind !== 0 ? { kind: kind, sequence_number: 0 } : { sequence_number: 0 };\n\n const leasedEp\n = to.ip?.length > 0\n ? {\n kind: Endpoint_LEASED_IP,\n sequence_number: endpointSequenceNumbers[to.ip] || 0,\n }\n : undefined;\n\n return leasedEp ? [defaultEp, leasedEp] : [defaultEp];\n })\n : [],\n );\n\n return endpoints;\n }\n\n serviceResourcesBeta2(profile: v2ProfileCompute, service: v2Service, asString: boolean = false) {\n return {\n cpu: this.serviceResourceCpu(profile.resources.cpu),\n memory: this.serviceResourceMemory(profile.resources.memory, asString),\n storage: this.serviceResourceStorage(profile.resources.storage, asString),\n endpoints: this.v2ServiceResourceEndpoints(service),\n };\n }\n\n serviceResourcesBeta3(id: number, profile: v3ProfileCompute, service: v2Service, asString: boolean = false) {\n return {\n id: id,\n cpu: this.serviceResourceCpu(profile.resources.cpu),\n memory: this.serviceResourceMemory(profile.resources.memory, asString),\n storage: this.serviceResourceStorage(profile.resources.storage, asString),\n gpu: this.serviceResourceGpu(profile.resources.gpu, asString),\n endpoints: this.v3ServiceResourceEndpoints(service),\n };\n }\n\n /**\n * Parses the service protocol.\n *\n * @param proto - The protocol string (e.g., \"TCP\", \"UDP\").\n * @returns The parsed protocol.\n * @throws Will throw an error if the protocol is unsupported.\n *\n * @example\n * ```ts\n * const protocol = SDL.parseServiceProto(\"TCP\");\n * // protocol is \"TCP\"\n * ```\n */\n parseServiceProto(proto?: string): string {\n const raw = proto?.toUpperCase() || \"TCP\";\n if (raw === \"TCP\" || raw === \"UDP\") return raw;\n\n throw new SdlValidationError(`Unsupported service protocol: \"${proto}\". Supported protocols are \"TCP\" and \"UDP\".`);\n }\n\n manifestExposeService(to: v2ExposeTo) {\n return to.service || \"\";\n }\n\n manifestExposeGlobal(to: v2ExposeTo) {\n return to.global || false;\n }\n\n manifestExposeHosts(expose: v2Expose) {\n return expose.accept || null;\n }\n\n v2HttpOptions(http_options: v2HTTPOptions | undefined) {\n const defaults = {\n MaxBodySize: 1048576,\n ReadTimeout: 60000,\n SendTimeout: 60000,\n NextTries: 3,\n NextTimeout: 0,\n NextCases: [\"error\", \"timeout\"],\n };\n\n if (!http_options) {\n return { ...defaults };\n }\n\n return {\n MaxBodySize: http_options.max_body_size || defaults.MaxBodySize,\n ReadTimeout: http_options.read_timeout || defaults.ReadTimeout,\n SendTimeout: http_options.send_timeout || defaults.SendTimeout,\n NextTries: http_options.next_tries || defaults.NextTries,\n NextTimeout: http_options.next_timeout || defaults.NextTimeout,\n NextCases: http_options.next_cases || defaults.NextCases,\n };\n }\n\n v3HttpOptions(http_options: v2HTTPOptions | undefined) {\n const defaults = {\n maxBodySize: 1048576,\n readTimeout: 60000,\n sendTimeout: 60000,\n nextTries: 3,\n nextTimeout: 0,\n nextCases: [\"error\", \"timeout\"],\n };\n\n if (!http_options) {\n return { ...defaults };\n }\n\n return {\n maxBodySize: http_options.max_body_size || defaults.maxBodySize,\n readTimeout: http_options.read_timeout || defaults.readTimeout,\n sendTimeout: http_options.send_timeout || defaults.sendTimeout,\n nextTries: http_options.next_tries || defaults.nextTries,\n nextTimeout: http_options.next_timeout || defaults.nextTimeout,\n nextCases: http_options.next_cases || defaults.nextCases,\n };\n }\n\n v2ManifestExposeHttpOptions(expose: v2Expose): v2ServiceExposeHttpOptions {\n return this.v2HttpOptions(expose.http_options);\n }\n\n v3ManifestExposeHttpOptions(expose: v2Expose): v3ServiceExposeHttpOptions {\n return this.v3HttpOptions(expose.http_options);\n }\n\n v2ManifestExpose(service: v2Service): v2ServiceExpose[] {\n const endpointSequenceNumbers = this.computeEndpointSequenceNumbers(this.data);\n return service.expose.flatMap((expose) =>\n expose.to\n ? expose.to.map((to) => ({\n Port: expose.port,\n ExternalPort: expose.as || 0,\n Proto: this.parseServiceProto(expose.proto),\n Service: this.manifestExposeService(to),\n Global: this.manifestExposeGlobal(to),\n Hosts: this.manifestExposeHosts(expose),\n HTTPOptions: this.v2ManifestExposeHttpOptions(expose),\n IP: to.ip || \"\",\n EndpointSequenceNumber: endpointSequenceNumbers[to.ip] || 0,\n }))\n : [],\n );\n }\n\n v3ManifestExpose(service: v2Service): v3ServiceExpose[] {\n const endpointSequenceNumbers = this.computeEndpointSequenceNumbers(this.data);\n return service.expose\n .flatMap((expose) =>\n expose.to\n ? expose.to.map((to) => ({\n port: expose.port,\n externalPort: expose.as || 0,\n proto: this.parseServiceProto(expose.proto),\n service: this.manifestExposeService(to),\n global: this.manifestExposeGlobal(to),\n hosts: this.manifestExposeHosts(expose),\n httpOptions: this.v3ManifestExposeHttpOptions(expose),\n ip: to.ip || \"\",\n endpointSequenceNumber: endpointSequenceNumbers[to.ip] || 0,\n }))\n : [],\n )\n .sort((a, b) => {\n if (a.service != b.service) return a.service.localeCompare(b.service);\n if (a.port != b.port) return a.port - b.port;\n if (a.proto != b.proto) return a.proto.localeCompare(b.proto);\n if (a.global != b.global) return a.global ? -1 : 1;\n\n return 0;\n });\n }\n\n v2ManifestServiceParams(params: v2ServiceParams): v2ManifestServiceParams | undefined {\n return {\n Storage: Object.keys(params?.storage ?? {}).map((name) => {\n if (!params?.storage) throw new Error(\"Storage is undefined\");\n return {\n name: name,\n mount: params.storage[name].mount,\n readOnly: params.storage[name].readOnly || false,\n };\n }),\n ...(params?.permissions ? { Permissions: params.permissions } : {}),\n };\n }\n\n v3ManifestServiceParams(params: v2ServiceParams | undefined): v3ManifestServiceParams | null {\n if (params === undefined) {\n return null;\n }\n\n return {\n storage: Object.keys(params?.storage ?? {}).map((name) => {\n if (!params?.storage) throw new Error(\"Storage is undefined\");\n return {\n name: name,\n mount: params.storage[name]?.mount,\n readOnly: params.storage[name]?.readOnly || false,\n };\n }),\n ...(params?.permissions ? { permissions: params.permissions } : {}),\n };\n }\n\n v2ManifestService(placement: string, name: string, asString: boolean): v2ManifestService {\n const service = this.data.services[name];\n const deployment = this.data.deployment[name];\n const profile = this.data.profiles.compute[deployment[placement].profile];\n\n const manifestService: v2ManifestService = {\n Name: name,\n Image: service.image,\n Command: service.command || null,\n Args: service.args || null,\n Env: service.env || null,\n Resources: this.serviceResourcesBeta2(profile, service, asString),\n Count: deployment[placement].count,\n Expose: this.v2ManifestExpose(service),\n };\n\n if (service.params) {\n manifestService.params = this.v2ManifestServiceParams(service.params);\n }\n\n return manifestService;\n }\n\n v3ManifestService(id: number, placement: string, name: string, asString: boolean): v3ManifestService {\n const service = this.data.services[name];\n const deployment = this.data.deployment[name];\n const profile = this.data.profiles.compute[deployment[placement].profile];\n const credentials = service.credentials || null;\n\n if (credentials && !credentials.email) {\n credentials.email = \"\";\n }\n\n const manifestService: v3ManifestService = {\n name: name,\n image: service.image,\n command: service.command || null,\n args: service.args || null,\n env: service.env || null,\n resources: this.serviceResourcesBeta3(id, profile as v3ProfileCompute, service, asString),\n count: deployment[placement].count,\n expose: this.v3ManifestExpose(service),\n params: this.v3ManifestServiceParams(service.params),\n credentials,\n };\n\n if (!manifestService.params) {\n delete manifestService.params;\n }\n\n return manifestService;\n }\n\n v2Manifest(asString: boolean = false): v2Manifest {\n return Object.keys(this.placements()).map((name) => ({\n Name: name,\n Services: this.deploymentsByPlacement(name).map(([service]) => this.v2ManifestService(name, service, asString)),\n }));\n }\n\n v3Manifest(asString: boolean = false): v3Manifest {\n const groups = this.v3Groups();\n const serviceId = (pIdx: number, sIdx: number) => groups[pIdx].resources[sIdx].resource.id;\n\n return Object.keys(this.placements()).map((name, pIdx) => ({\n name: name,\n services: this.deploymentsByPlacement(name)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([service], idx) => this.v3ManifestService(serviceId(pIdx, idx), name, service, asString)),\n }));\n }\n\n manifest(asString: boolean = false): v2Manifest | v3Manifest {\n return this.version === \"beta2\" ? this.v2Manifest(asString) : this.v3Manifest(asString);\n }\n\n /**\n * Computes the endpoint sequence numbers for the given SDL.\n *\n * @param sdl - The SDL data.\n * @returns An object mapping IPs to their sequence numbers.\n *\n * @example\n * ```ts\n * const sequenceNumbers = sdl.computeEndpointSequenceNumbers(sdlData);\n * // sequenceNumbers might be { \"192.168.1.1\": 1, \"192.168.1.2\": 2 }\n * ```\n */\n computeEndpointSequenceNumbers(sdl: v2Sdl) {\n return Object.fromEntries(\n Object.values(sdl.services).flatMap((service) =>\n service.expose.flatMap((expose) =>\n expose.to\n ? expose.to\n .filter((to) => to.global && to.ip?.length > 0)\n .map((to) => to.ip)\n .sort()\n .map((ip, index) => [ip, index + 1])\n : [],\n ),\n ),\n );\n }\n\n resourceUnitCpu(computeResources: v2ComputeResources, asString: boolean) {\n const attributes = computeResources.cpu.attributes;\n const cpu = isString(computeResources.cpu.units) ? convertCpuResourceString(computeResources.cpu.units) : computeResources.cpu.units * 1000;\n\n return {\n units: { val: this.resourceValue(cpu, asString) },\n attributes:\n attributes\n && Object.entries(attributes)\n .sort(([k0], [k1]) => k0.localeCompare(k1))\n .map(([key, value]) => ({\n key: key,\n value: value.toString(),\n })),\n };\n }\n\n resourceUnitMemory(computeResources: v2ComputeResources, asString: boolean) {\n const attributes = computeResources.memory.attributes;\n\n return {\n quantity: {\n val: this.resourceValue(convertResourceString(computeResources.memory.size), asString),\n },\n attributes:\n attributes\n && Object.entries(attributes)\n .sort(([k0], [k1]) => k0.localeCompare(k1))\n .map(([key, value]) => ({\n key: key,\n value: value.toString(),\n })),\n };\n }\n\n resourceUnitStorage(computeResources: v2ComputeResources, asString: boolean) {\n const storages = isArray(computeResources.storage) ? computeResources.storage : [computeResources.storage];\n\n return storages.map((storage) => ({\n name: storage.name || \"default\",\n quantity: {\n val: this.resourceValue(convertResourceString(storage.size), asString),\n },\n attributes: this.serviceResourceStorageAttributes(storage.attributes),\n }));\n }\n\n transformGpuAttributes(attributes: v3GPUAttributes): Array<{ key: string; value: string }> {\n return Object.entries(attributes.vendor).flatMap(([vendor, models]) =>\n models\n ? models.map((model) => {\n let key = `vendor/${vendor}/model/${model.model}`;\n\n if (model.ram) {\n key += `/ram/${model.ram}`;\n }\n\n if (model.interface) {\n key += `/interface/${model.interface}`;\n }\n\n return {\n key: key,\n value: \"true\",\n };\n })\n : [\n {\n key: `vendor/${vendor}/model/*`,\n value: \"true\",\n },\n ],\n );\n }\n\n resourceUnitGpu(computeResources: v3ComputeResources, asString: boolean) {\n const attributes = computeResources.gpu?.attributes;\n const units = computeResources.gpu?.units || \"0\";\n const gpu = isString(units) ? parseInt(units) : units;\n\n return {\n units: { val: this.resourceValue(gpu, asString) },\n attributes: attributes && this.transformGpuAttributes(attributes),\n };\n }\n\n groupResourceUnits(resource: v2ComputeResources | undefined, asString: boolean) {\n if (!resource) return {};\n\n const units = {\n endpoints: null,\n } as any;\n\n if (resource.cpu) {\n units.cpu = this.resourceUnitCpu(resource, asString);\n }\n\n if (resource.memory) {\n units.memory = this.resourceUnitMemory(resource, asString);\n }\n\n if (resource.storage) {\n units.storage = this.resourceUnitStorage(resource, asString);\n }\n\n if (this.version === \"beta3\") {\n units.gpu = this.resourceUnitGpu(resource as v3ComputeResources, asString);\n }\n\n return units;\n }\n\n exposeShouldBeIngress(expose: { proto: string; global: boolean; externalPort: number; port: number }) {\n const externalPort = expose.externalPort === 0 ? expose.port : expose.externalPort;\n\n return expose.global && expose.proto === \"TCP\" && externalPort === 80;\n }\n\n groups() {\n return this.version === \"beta2\" ? this.v2Groups() : this.v3Groups();\n }\n\n v3Groups() {\n const groups = new Map<\n string,\n {\n dgroup: v3DeploymentGroup;\n boundComputes: Record<string, Record<string, number>>;\n }\n >();\n const services = Object.entries(this.data.services).sort(([a], [b]) => a.localeCompare(b));\n\n for (const [svcName, service] of services) {\n for (const [placementName, svcdepl] of Object.entries(this.data.deployment[svcName])) {\n // objects below have been ensured to exist\n const compute = this.data.profiles.compute[svcdepl.profile];\n const infra = this.data.profiles.placement[placementName];\n const pricing = infra.pricing[svcdepl.profile];\n const price = {\n ...pricing,\n amount: pricing.amount?.toString(),\n };\n\n let group = groups.get(placementName);\n\n if (!group) {\n const attributes = (infra.attributes\n ? Object.entries(infra.attributes).map(([key, value]) => ({\n key,\n value,\n }))\n : []) as unknown as Array<{ key: string; value: string }>;\n\n attributes.sort((a, b) => a.key.localeCompare(b.key));\n\n group = {\n dgroup: {\n name: placementName,\n resources: [],\n requirements: {\n attributes: attributes,\n signedBy: {\n allOf: infra.signedBy?.allOf || [],\n anyOf: infra.signedBy?.anyOf || [],\n },\n },\n },\n boundComputes: {},\n };\n\n groups.set(placementName, group);\n }\n\n if (!group.boundComputes[placementName]) {\n group.boundComputes[placementName] = {};\n }\n\n // const resources = this.serviceResourcesBeta3(0, compute as v3ProfileCompute, service, false);\n const location = group.boundComputes[placementName][svcdepl.profile];\n\n if (!location) {\n const res = this.groupResourceUnits(compute.resources, false);\n res.endpoints = this.v3ServiceResourceEndpoints(service);\n\n const resID = group.dgroup.resources.length > 0 ? group.dgroup.resources.length + 1 : 1;\n res.id = resID;\n // resources.id = res.id;\n\n group.dgroup.resources.push({\n resource: res,\n price: price,\n count: svcdepl.count,\n } as any);\n\n group.boundComputes[placementName][svcdepl.profile] = group.dgroup.resources.length - 1;\n } else {\n const endpoints = this.v3ServiceResourceEndpoints(service);\n // resources.id = group.dgroup.resources[location].id;\n\n group.dgroup.resources[location].count += svcdepl.count;\n group.dgroup.resources[location].endpoints += endpoints as any;\n group.dgroup.resources[location].endpoints.sort();\n }\n }\n }\n\n // keep ordering stable\n const names: string[] = [...groups.keys()].sort();\n return names.map((name) => groups.get(name)).map((group) => (group ? (group.dgroup as typeof group.dgroup) : {})) as Array<v3DeploymentGroup>;\n }\n\n v2Groups() {\n const yamlJson = this.data;\n const ipEndpointNames = this.computeEndpointSequenceNumbers(yamlJson);\n\n const groups = {} as any;\n\n Object.keys(yamlJson.services).forEach((svcName) => {\n const svc = yamlJson.services[svcName];\n const depl = yamlJson.deployment[svcName];\n\n Object.keys(depl).forEach((placementName) => {\n const svcdepl = depl[placementName];\n const compute = yamlJson.profiles.compute[svcdepl.profile];\n const infra = yamlJson.profiles.placement[placementName];\n\n const pricing = infra.pricing[svcdepl.profile];\n const price = {\n ...pricing,\n amount: pricing.amount.toString(),\n };\n\n let group = groups[placementName];\n\n if (!group) {\n group = {\n name: placementName,\n requirements: {\n attributes: infra.attributes\n ? Object.entries(infra.attributes).map(([key, value]) => ({\n key,\n value,\n }))\n : [],\n signedBy: {\n allOf: infra.signedBy?.allOf || [],\n anyOf: infra.signedBy?.anyOf || [],\n },\n },\n resources: [],\n };\n\n if (group.requirements.attributes) {\n group.requirements.attributes = group.requirements.attributes.sort((a: any, b: any) => a.key < b.key);\n }\n\n groups[group.name] = group;\n }\n\n const resources = {\n resources: this.groupResourceUnits(compute.resources, false), // Changed resources => unit\n price: price,\n count: svcdepl.count,\n };\n\n const endpoints = [] as any[];\n svc?.expose?.forEach((expose) => {\n expose?.to\n ?.filter((to) => to.global)\n .forEach((to) => {\n const exposeSpec = {\n port: expose.port,\n externalPort: expose.as || 0,\n proto: this.parseServiceProto(expose.proto),\n global: !!to.global,\n };\n\n if (to.ip?.length > 0) {\n const seqNo = ipEndpointNames[to.ip];\n endpoints.push({\n kind: Endpoint_LEASED_IP,\n sequence_number: seqNo,\n });\n }\n\n const kind = this.exposeShouldBeIngress(exposeSpec) ? Endpoint_SHARED_HTTP : Endpoint_RANDOM_PORT;\n\n endpoints.push({ kind: kind, sequence_number: 0 });\n });\n });\n\n resources.resources.endpoints = endpoints;\n group.resources.push(resources);\n });\n });\n\n return Object.keys(groups)\n .sort((a, b) => (a < b ? 1 : 0))\n .map((name) => groups[name]);\n }\n\n /**\n * Escapes HTML characters in a string.\n *\n * @param raw - The raw string to escape.\n * @returns The escaped string.\n *\n * @example\n * ```ts\n * const escaped = sdl.escapeHtml(\"<div>Hello</div>\");\n * // escaped is \"\\\\u003cdiv\\\\u003eHello\\\\u003c/div\\\\u003e\"\n * ```\n */\n #escapeHtml(raw: string) {\n return raw.replace(/</g, \"\\\\u003c\").replace(/>/g, \"\\\\u003e\").replace(/&/g, \"\\\\u0026\");\n }\n\n manifestSortedJSON() {\n const manifest = this.manifest(true);\n let jsonStr = JSON.stringify(manifest);\n\n if (jsonStr) {\n jsonStr = jsonStr.replaceAll(\"\\\"quantity\\\":{\\\"val\", \"\\\"size\\\":{\\\"val\");\n }\n\n return this.#escapeHtml(stableStringify(JSON.parse(jsonStr)) || \"\");\n }\n\n async manifestVersion() {\n const jsonStr = this.manifestSortedJSON();\n const enc = new TextEncoder();\n const sortedBytes = enc.encode(jsonStr);\n const sum = await crypto.subtle.digest(\"SHA-256\", sortedBytes);\n\n return new Uint8Array(sum);\n }\n\n manifestSorted() {\n const sorted = this.manifestSortedJSON();\n return JSON.parse(sorted);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["YAML", "storage", "stableStringify"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/sdl/SDL/SdlValidationError.ts"],
4
- "sourcesContent": ["export class SdlValidationError extends Error {\n /**\n * Asserts a condition and throws an `SdlValidationError` if the condition is false.\n * @param condition - The condition to assert.\n * @param message - The error message to throw if the assertion fails.\n * @example\n * SdlValidationError.assert(someCondition, \"Condition failed\");\n */\n static assert(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new SdlValidationError(message);\n }\n }\n\n /**\n * Creates an instance of `SdlValidationError`.\n * @param message - The error message.\n */\n constructor(message: string) {\n super(message);\n this.name = \"SdlValidationError\";\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,2BAA2B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5C,OAAO,OAAO,WAAoB,SAAoC;AACpE,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,mBAAmB,OAAO;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;",
4
+ "sourcesContent": ["/**\n * @deprecated This class is deprecated and will be removed in future versions.\n */\nexport class SdlValidationError extends Error {\n /**\n * Asserts a condition and throws an `SdlValidationError` if the condition is false.\n * @param condition - The condition to assert.\n * @param message - The error message to throw if the assertion fails.\n * @example\n * SdlValidationError.assert(someCondition, \"Condition failed\");\n */\n static assert(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new SdlValidationError(message);\n }\n }\n\n /**\n * Creates an instance of `SdlValidationError`.\n * @param message - The error message.\n */\n constructor(message: string) {\n super(message);\n this.name = \"SdlValidationError\";\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,2BAA2B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5C,OAAO,OAAO,WAAoB,SAAoC;AACpE,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,mBAAmB,OAAO;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;",
6
6
  "names": []
7
7
  }
@@ -21,12 +21,17 @@ var sdl_exports = {};
21
21
  __export(sdl_exports, {
22
22
  SDL: () => import_SDL.SDL,
23
23
  SdlValidationError: () => import_SdlValidationError.SdlValidationError,
24
+ generateManifest: () => import_generateManifest.generateManifest,
25
+ generateManifestVersion: () => import_generateManifestVersion.generateManifestVersion,
26
+ manifestToSortedJSON: () => import_generateManifestVersion.manifestToSortedJSON,
24
27
  validateSDL: () => import_validateSDL.validateSDL,
25
28
  validationSDLSchema: () => import_validateSDL.validationSDLSchema
26
29
  });
27
30
  module.exports = __toCommonJS(sdl_exports);
28
31
  var import_SDL = require("./SDL/SDL.cjs");
29
- var import_validateSDL = require("./SDL/validateSDL/validateSDL.cjs");
32
+ var import_validateSDL = require("./validateSDL/validateSDL.cjs");
30
33
  __reExport(sdl_exports, require("./types.cjs"), module.exports);
31
34
  var import_SdlValidationError = require("./SDL/SdlValidationError.cjs");
35
+ var import_generateManifest = require("./manifest/generateManifest.cjs");
36
+ var import_generateManifestVersion = require("./manifest/generateManifestVersion.cjs");
32
37
  //# sourceMappingURL=index.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/sdl/index.ts"],
4
- "sourcesContent": ["/**\n * SDL (Stack Definition Language) module exports\n * Provides functionality for parsing and validating Akash deployment manifests\n *\n * @example\n * ```ts\n * import { SDL } from './sdl';\n *\n * const yaml = `\n * version: \"2.0\"\n * services:\n * web:\n * image: nginx\n * expose:\n * - port: 80\n * as: 80\n * to:\n * - global: true\n * `;\n *\n * const sdl = SDL.fromString(yaml);\n * const manifest = sdl.manifest();\n * ```\n */\nexport { SDL } from \"./SDL/SDL.ts\";\n\nexport { validateSDL, validationSDLSchema } from \"./SDL/validateSDL/validateSDL.ts\";\nexport type { SDLInput } from \"./SDL/validateSDL/validateSDLInput.ts\";\nexport type { ValidationError } from \"../utils/jsonSchemaValidation.ts\";\n\nexport * from \"./types.ts\";\nexport { SdlValidationError } from \"./SDL/SdlValidationError.ts\";\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBA,iBAAoB;AAEpB,yBAAiD;AAIjD,wBAAc,uBA9Bd;AA+BA,gCAAmC;",
4
+ "sourcesContent": ["/**\n * SDL (Stack Definition Language) module exports\n * Provides functionality for parsing and validating Akash deployment manifests\n *\n * @example\n * ```ts\n * import { SDL } from './sdl';\n *\n * const yaml = `\n * version: \"2.0\"\n * services:\n * web:\n * image: nginx\n * expose:\n * - port: 80\n * as: 80\n * to:\n * - global: true\n * `;\n *\n * const sdl = SDL.fromString(yaml);\n * const manifest = sdl.manifest();\n * ```\n */\nexport { SDL } from \"./SDL/SDL.ts\";\n\nexport { validateSDL, validationSDLSchema } from \"./validateSDL/validateSDL.ts\";\nexport type { SDLInput } from \"./validateSDL/validateSDLInput.ts\";\nexport type { ValidationError } from \"../utils/jsonSchemaValidation.ts\";\n\nexport * from \"./types.ts\";\nexport { SdlValidationError } from \"./SDL/SdlValidationError.ts\";\n\nexport { generateManifest } from \"./manifest/generateManifest.ts\";\nexport type { Manifest, GenerateManifestResult } from \"./manifest/generateManifest.ts\";\nexport { generateManifestVersion, manifestToSortedJSON } from \"./manifest/generateManifestVersion.ts\";\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBA,iBAAoB;AAEpB,yBAAiD;AAIjD,wBAAc,uBA9Bd;AA+BA,gCAAmC;AAEnC,8BAAiC;AAEjC,qCAA8D;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var generateManifest_exports = {};
20
+ __export(generateManifest_exports, {
21
+ generateManifest: () => generateManifest
22
+ });
23
+ module.exports = __toCommonJS(generateManifest_exports);
24
+ var import_attribute = require("../../generated/protos/akash/base/attributes/v1/attribute.cjs");
25
+ var import_cpu = require("../../generated/protos/akash/base/resources/v1beta4/cpu.cjs");
26
+ var import_gpu = require("../../generated/protos/akash/base/resources/v1beta4/gpu.cjs");
27
+ var import_memory = require("../../generated/protos/akash/base/resources/v1beta4/memory.cjs");
28
+ var import_resources = require("../../generated/protos/akash/base/resources/v1beta4/resources.cjs");
29
+ var import_storage = require("../../generated/protos/akash/base/resources/v1beta4/storage.cjs");
30
+ var import_groupspec = require("../../generated/protos/akash/deployment/v1beta4/groupspec.cjs");
31
+ var import_resourceunit = require("../../generated/protos/akash/deployment/v1beta4/resourceunit.cjs");
32
+ var import_group = require("../../generated/protos/akash/manifest/v2beta3/group.cjs");
33
+ var import_service = require("../../generated/protos/akash/manifest/v2beta3/service.cjs");
34
+ var import_serviceexpose = require("../../generated/protos/akash/manifest/v2beta3/serviceexpose.cjs");
35
+ var import_config = require("../../network/config.cjs");
36
+ var import_utils = require("../utils.cjs");
37
+ var import_validateSDL = require("../validateSDL/validateSDL.cjs");
38
+ var import_manifestUtils = require("./manifestUtils.cjs");
39
+ function generateManifest(sdl, networkId = import_config.MAINNET_ID) {
40
+ const errors = (0, import_validateSDL.validateSDL)(sdl, networkId);
41
+ if (errors) return { ok: false, value: errors };
42
+ const endpointSequenceNumbers = (0, import_manifestUtils.computeEndpointSequenceNumbers)(sdl.services);
43
+ const groupsMap = /* @__PURE__ */ new Map();
44
+ const resourceIds = /* @__PURE__ */ new Map();
45
+ const deploymentsByPlacement = /* @__PURE__ */ new Map();
46
+ for (const [svcName, placements] of Object.entries(sdl.deployment)) {
47
+ for (const [placementName, deployment] of Object.entries(placements)) {
48
+ let list = deploymentsByPlacement.get(placementName);
49
+ if (!list) {
50
+ list = [];
51
+ deploymentsByPlacement.set(placementName, list);
52
+ }
53
+ list.push([svcName, deployment]);
54
+ }
55
+ }
56
+ for (const list of deploymentsByPlacement.values()) {
57
+ list.sort(([a], [b]) => a.localeCompare(b));
58
+ }
59
+ const services = Object.entries(sdl.services).sort(([a], [b]) => a.localeCompare(b));
60
+ for (const [svcName, service] of services) {
61
+ for (const [placementName, svcdepl] of Object.entries(sdl.deployment[svcName])) {
62
+ const compute = sdl.profiles.compute[svcdepl.profile];
63
+ const infra = sdl.profiles.placement[placementName];
64
+ const pricing = infra.pricing[svcdepl.profile];
65
+ const price = {
66
+ denom: pricing.denom,
67
+ amount: pricing.amount?.toString()
68
+ };
69
+ let group = groupsMap.get(placementName);
70
+ if (!group) {
71
+ group = {
72
+ dgroup: import_groupspec.GroupSpec.fromPartial({
73
+ name: placementName,
74
+ resources: [],
75
+ requirements: import_attribute.PlacementRequirements.fromPartial({
76
+ attributes: (0, import_manifestUtils.buildResourceAttributes)(infra.attributes) ?? [],
77
+ signedBy: import_attribute.SignedBy.fromPartial({
78
+ allOf: infra.signedBy?.allOf,
79
+ anyOf: infra.signedBy?.anyOf
80
+ })
81
+ })
82
+ }),
83
+ boundComputes: {}
84
+ };
85
+ groupsMap.set(placementName, group);
86
+ }
87
+ const profileKey = `${placementName}:${svcdepl.profile}`;
88
+ const location = group.boundComputes[svcdepl.profile];
89
+ if (location === void 0) {
90
+ const resId = group.dgroup.resources.length > 0 ? group.dgroup.resources.length + 1 : 1;
91
+ resourceIds.set(profileKey, resId);
92
+ const resources = buildResources(resId, compute, service, endpointSequenceNumbers);
93
+ group.dgroup.resources.push(
94
+ import_resourceunit.ResourceUnit.fromPartial({
95
+ resource: resources,
96
+ count: svcdepl.count,
97
+ price
98
+ })
99
+ );
100
+ group.boundComputes[svcdepl.profile] = group.dgroup.resources.length - 1;
101
+ } else {
102
+ if (!resourceIds.has(profileKey)) {
103
+ resourceIds.set(profileKey, group.dgroup.resources[location].resource.id);
104
+ }
105
+ group.dgroup.resources[location].count += svcdepl.count;
106
+ group.dgroup.resources[location].resource.endpoints.push(
107
+ ...(0, import_manifestUtils.buildServiceEndpoints)(service, endpointSequenceNumbers)
108
+ );
109
+ }
110
+ }
111
+ }
112
+ for (const group of groupsMap.values()) {
113
+ for (const resourceUnit of group.dgroup.resources) {
114
+ resourceUnit.resource.endpoints.sort(
115
+ (a, b) => a.kind - b.kind || a.sequenceNumber - b.sequenceNumber
116
+ );
117
+ }
118
+ }
119
+ const sortedGroupNames = [...groupsMap.keys()].sort();
120
+ let groups;
121
+ let groupSpecs;
122
+ const manifest = {
123
+ get groups() {
124
+ groups ?? (groups = sortedGroupNames.map((placementName) => {
125
+ const deployments = deploymentsByPlacement.get(placementName);
126
+ return import_group.Group.fromPartial({
127
+ name: placementName,
128
+ services: deployments.map(([svcName]) => {
129
+ const service = sdl.services[svcName];
130
+ const deployment = sdl.deployment[svcName][placementName];
131
+ const compute = sdl.profiles.compute[deployment.profile];
132
+ const resourceId = resourceIds.get(`${placementName}:${deployment.profile}`) || 1;
133
+ return buildManifestService(
134
+ resourceId,
135
+ svcName,
136
+ service,
137
+ compute,
138
+ deployment.count,
139
+ endpointSequenceNumbers
140
+ );
141
+ })
142
+ });
143
+ }));
144
+ return groups;
145
+ },
146
+ get groupSpecs() {
147
+ groupSpecs ?? (groupSpecs = sortedGroupNames.map((name) => groupsMap.get(name).dgroup));
148
+ return groupSpecs;
149
+ }
150
+ };
151
+ return { ok: true, value: manifest };
152
+ }
153
+ function buildResources(id, compute, service, endpointSequenceNumbers) {
154
+ const res = compute.resources;
155
+ const cpuAttributes = (0, import_manifestUtils.buildResourceAttributes)(res.cpu.attributes);
156
+ const gpuAttributes = res.gpu?.attributes ? (0, import_manifestUtils.transformGpuAttributes)(res.gpu.attributes) : [];
157
+ return import_resources.Resources.fromPartial({
158
+ id,
159
+ cpu: import_cpu.CPU.fromPartial({
160
+ units: { val: (0, import_manifestUtils.encodeResourceValue)((0, import_manifestUtils.parseCpuUnits)(res.cpu)) },
161
+ attributes: cpuAttributes
162
+ }),
163
+ memory: import_memory.Memory.fromPartial({
164
+ quantity: { val: (0, import_manifestUtils.encodeResourceValue)((0, import_manifestUtils.parseMemoryBytes)(res.memory)) }
165
+ }),
166
+ storage: (0, import_utils.castArray)(res.storage).map(
167
+ (s) => import_storage.Storage.fromPartial({
168
+ name: s.name || "default",
169
+ quantity: { val: (0, import_manifestUtils.encodeResourceValue)((0, import_manifestUtils.parseStorageBytes)(s.size)) },
170
+ attributes: (0, import_manifestUtils.buildStorageAttributes)(s.attributes)
171
+ })
172
+ ),
173
+ gpu: import_gpu.GPU.fromPartial({
174
+ units: { val: (0, import_manifestUtils.encodeResourceValue)((0, import_manifestUtils.parseGpuUnits)(res.gpu)) },
175
+ attributes: gpuAttributes
176
+ }),
177
+ endpoints: (0, import_manifestUtils.buildServiceEndpoints)(service, endpointSequenceNumbers)
178
+ });
179
+ }
180
+ function buildManifestService(resourceId, name, service, compute, count, endpointSequenceNumbers) {
181
+ const credentials = service.credentials ? import_service.ImageCredentials.fromPartial({
182
+ host: service.credentials.host,
183
+ email: service.credentials.email || "",
184
+ username: service.credentials.username,
185
+ password: service.credentials.password
186
+ }) : void 0;
187
+ const params = buildParams(service);
188
+ return import_service.Service.fromPartial({
189
+ name,
190
+ image: service.image,
191
+ command: service.command || [],
192
+ args: service.args || [],
193
+ env: service.env || [],
194
+ resources: buildResources(resourceId, compute, service, endpointSequenceNumbers),
195
+ count,
196
+ expose: buildManifestExpose(service, endpointSequenceNumbers),
197
+ params,
198
+ credentials
199
+ });
200
+ }
201
+ function buildParams(service) {
202
+ if (!service.params) return void 0;
203
+ const storageEntries = Object.entries(service.params.storage ?? {});
204
+ const result = import_service.ServiceParams.fromPartial({
205
+ storage: storageEntries.map(
206
+ ([name, config]) => import_service.StorageParams.fromPartial({
207
+ name,
208
+ mount: config.mount || "",
209
+ readOnly: config.readOnly || false
210
+ })
211
+ )
212
+ });
213
+ if (service.params.permissions) {
214
+ result.permissions = service.params.permissions;
215
+ }
216
+ return result;
217
+ }
218
+ function buildManifestExpose(service, endpointSequenceNumbers) {
219
+ return (service.expose ?? []).flatMap(
220
+ (expose) => (expose.to ?? []).map(
221
+ (to) => import_serviceexpose.ServiceExpose.fromPartial({
222
+ port: expose.port,
223
+ externalPort: expose.as,
224
+ proto: (0, import_manifestUtils.parseServiceProto)(expose.proto),
225
+ service: to.service || "",
226
+ global: to.global || false,
227
+ hosts: expose.accept || [],
228
+ httpOptions: (0, import_manifestUtils.buildHttpOptions)(expose.http_options),
229
+ ip: to.ip || "",
230
+ endpointSequenceNumber: endpointSequenceNumbers[to.ip]
231
+ })
232
+ )
233
+ ).sort((a, b) => {
234
+ if (a.service !== b.service) return a.service.localeCompare(b.service);
235
+ if (a.port !== b.port) return a.port - b.port;
236
+ if (a.proto !== b.proto) return a.proto.localeCompare(b.proto);
237
+ if (a.global !== b.global) return a.global ? -1 : 1;
238
+ return 0;
239
+ });
240
+ }
241
+ //# sourceMappingURL=generateManifest.cjs.map