@akashnetwork/chain-sdk 1.0.0-alpha.22 → 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.
- package/README.md +42 -4
- package/dist/cjs/index.shared.cjs +1 -0
- package/dist/cjs/index.shared.cjs.map +2 -2
- package/dist/cjs/sdl/SDL/SDL.cjs +1 -1
- package/dist/cjs/sdl/SDL/SDL.cjs.map +2 -2
- package/dist/cjs/sdl/SDL/SdlValidationError.cjs.map +2 -2
- package/dist/cjs/sdl/index.cjs +6 -1
- package/dist/cjs/sdl/index.cjs.map +2 -2
- package/dist/cjs/sdl/manifest/generateManifest.cjs +241 -0
- package/dist/cjs/sdl/manifest/generateManifest.cjs.map +7 -0
- package/dist/cjs/sdl/manifest/generateManifestVersion.cjs +84 -0
- package/dist/cjs/sdl/manifest/generateManifestVersion.cjs.map +7 -0
- package/dist/cjs/sdl/manifest/manifestUtils.cjs +138 -0
- package/dist/cjs/sdl/manifest/manifestUtils.cjs.map +7 -0
- package/dist/cjs/sdl/types.cjs.map +1 -1
- package/dist/cjs/sdl/{SDL/utils.cjs.map → utils.cjs.map} +1 -1
- package/dist/cjs/sdl/{SDL/validateSDL → validateSDL}/validateSDL.cjs +20 -13
- package/dist/cjs/sdl/validateSDL/validateSDL.cjs.map +7 -0
- package/dist/cjs/sdl/{SDL/validateSDL → validateSDL}/validateSDLInput.cjs +3 -3
- package/dist/cjs/sdl/validateSDL/validateSDLInput.cjs.map +7 -0
- package/dist/cjs/utils/yaml.cjs +44 -0
- package/dist/cjs/utils/yaml.cjs.map +7 -0
- package/dist/esm/chunk-2XL6OX6E.js +1 -0
- package/dist/esm/chunk-2XL6OX6E.js.map +7 -0
- package/dist/esm/{chunk-K3L3J5XB.js → chunk-4D3QNKFB.js} +3 -3
- package/dist/esm/{chunk-DUCGLLTN.js → chunk-5DCYIWCG.js} +100 -100
- package/dist/esm/{chunk-DUCGLLTN.js.map → chunk-5DCYIWCG.js.map} +4 -4
- package/dist/esm/{chunk-BGBAJIKV.js → chunk-5YECXI3P.js} +2 -2
- package/dist/esm/{chunk-MEXNRJE4.js → chunk-BYQF33C6.js} +2 -2
- package/dist/esm/{chunk-R5DUC7IU.js → chunk-C7UQYVYH.js} +2 -2
- package/dist/esm/{chunk-726NIMPF.js → chunk-JISXXX24.js} +2 -2
- package/dist/esm/{chunk-6OEI5BYK.js → chunk-QSKWS3TI.js} +468 -54
- package/dist/esm/chunk-QSKWS3TI.js.map +7 -0
- package/dist/esm/{chunk-EYW7M3KV.js → chunk-SA4SEZ6F.js} +2 -2
- package/dist/esm/{chunk-ST2QQ72E.js → chunk-VRE72ZD5.js} +2 -2
- package/dist/esm/{chunk-A5CS5ZKQ.js → chunk-XFCN5LRY.js} +2 -2
- package/dist/esm/chunk-Z5KZUB7X.js +364 -0
- package/dist/esm/chunk-Z5KZUB7X.js.map +7 -0
- package/dist/esm/generated/protos/index.akash.v1.js +6 -6
- package/dist/esm/generated/protos/index.akash.v1beta4.js +14 -349
- package/dist/esm/generated/protos/index.akash.v1beta4.js.map +4 -4
- package/dist/esm/generated/protos/index.akash.v1beta5.js +5 -5
- package/dist/esm/generated/protos/index.provider.akash.v1.js +3 -3
- package/dist/esm/generated/protos/index.provider.akash.v2beta3.js +3 -2
- package/dist/esm/index.js +30 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.web.js +29 -3
- package/dist/esm/index.web.js.map +1 -1
- package/dist/esm/{query_akash-XTPHUGJZ.js → query_akash-4CTLBKZR.js} +4 -4
- package/dist/esm/{query_akash-IXSQT2VJ.js → query_akash-DJ7LTLRE.js} +5 -5
- package/dist/esm/{service_akash-YMJ4ZYYX.js → service_akash-AZFAYT7H.js} +4 -4
- package/dist/esm/{service_akash-2EBLHFIP.js → service_akash-VMU3LNBA.js} +4 -4
- package/dist/esm/{service_akash-AYYJKBHS.js → service_akash-WRGOVR7I.js} +4 -4
- package/dist/sdl-schema.yaml +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/index.shared.d.ts +1 -0
- package/dist/types/sdl/SDL/SDL.d.ts +2 -0
- package/dist/types/sdl/SDL/SdlValidationError.d.ts +3 -0
- package/dist/types/sdl/index.d.ts +5 -2
- package/dist/types/sdl/manifest/generateManifest.d.ts +18 -0
- package/dist/types/sdl/manifest/generateManifestVersion.d.ts +3 -0
- package/dist/types/sdl/manifest/manifestUtils.d.ts +27 -0
- package/dist/types/sdl/types.d.ts +52 -0
- package/dist/types/sdl/{SDL/validateSDL → validateSDL}/validateSDL.d.ts +2 -2
- package/dist/types/utils/yaml.d.ts +38 -0
- package/package.json +1 -1
- package/dist/cjs/sdl/SDL/validateSDL/validateSDL.cjs.map +0 -7
- package/dist/cjs/sdl/SDL/validateSDL/validateSDLInput.cjs.map +0 -7
- package/dist/esm/chunk-6OEI5BYK.js.map +0 -7
- /package/dist/cjs/sdl/{SDL/utils.cjs → utils.cjs} +0 -0
- /package/dist/esm/{chunk-K3L3J5XB.js.map → chunk-4D3QNKFB.js.map} +0 -0
- /package/dist/esm/{chunk-BGBAJIKV.js.map → chunk-5YECXI3P.js.map} +0 -0
- /package/dist/esm/{chunk-MEXNRJE4.js.map → chunk-BYQF33C6.js.map} +0 -0
- /package/dist/esm/{chunk-R5DUC7IU.js.map → chunk-C7UQYVYH.js.map} +0 -0
- /package/dist/esm/{chunk-726NIMPF.js.map → chunk-JISXXX24.js.map} +0 -0
- /package/dist/esm/{chunk-EYW7M3KV.js.map → chunk-SA4SEZ6F.js.map} +0 -0
- /package/dist/esm/{chunk-ST2QQ72E.js.map → chunk-VRE72ZD5.js.map} +0 -0
- /package/dist/esm/{chunk-A5CS5ZKQ.js.map → chunk-XFCN5LRY.js.map} +0 -0
- /package/dist/esm/{query_akash-XTPHUGJZ.js.map → query_akash-4CTLBKZR.js.map} +0 -0
- /package/dist/esm/{query_akash-IXSQT2VJ.js.map → query_akash-DJ7LTLRE.js.map} +0 -0
- /package/dist/esm/{service_akash-YMJ4ZYYX.js.map → service_akash-AZFAYT7H.js.map} +0 -0
- /package/dist/esm/{service_akash-2EBLHFIP.js.map → service_akash-VMU3LNBA.js.map} +0 -0
- /package/dist/esm/{service_akash-AYYJKBHS.js.map → service_akash-WRGOVR7I.js.map} +0 -0
- /package/dist/types/sdl/{SDL/utils.d.ts → utils.d.ts} +0 -0
- /package/dist/types/sdl/{SDL/validateSDL → validateSDL}/validateSDLInput.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 {
|
|
252
|
+
import { generateManifest, yaml, type SDLInput } from "@akashnetwork/chain-sdk";
|
|
253
253
|
|
|
254
|
-
|
|
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
|
|
267
|
-
|
|
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
|
}
|
package/dist/cjs/sdl/SDL/SDL.cjs
CHANGED
|
@@ -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;
|
|
@@ -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 ...(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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",
|
|
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": ["
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
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
|
}
|
package/dist/cjs/sdl/index.cjs
CHANGED
|
@@ -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("./
|
|
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 \"./
|
|
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
|