@xemahq/xema 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -15
- package/dist/assets/boot-graph.json +72 -0
- package/dist/assets/core/distribution.lock.json +1244 -0
- package/dist/assets/core/images.lock.json +428 -0
- package/dist/assets/oss/distribution.lock.json +1978 -0
- package/dist/assets/oss/images.lock.json +594 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +36 -14
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/down.d.ts +3 -0
- package/dist/commands/down.d.ts.map +1 -0
- package/dist/commands/down.js +54 -0
- package/dist/commands/down.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +61 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +38 -8
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +41 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/up.d.ts +3 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +44 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/dev/infra-preflight.js +1 -1
- package/dist/dev/infra-preflight.js.map +1 -1
- package/dist/lib/command-registry.d.ts +1 -1
- package/dist/lib/command-registry.d.ts.map +1 -1
- package/dist/lib/command-registry.js +4 -0
- package/dist/lib/command-registry.js.map +1 -1
- package/dist/runtime/boot-graph-loader.d.ts +17 -0
- package/dist/runtime/boot-graph-loader.d.ts.map +1 -0
- package/dist/runtime/boot-graph-loader.js +40 -0
- package/dist/runtime/boot-graph-loader.js.map +1 -0
- package/dist/runtime/config/loader.d.ts +11 -0
- package/dist/runtime/config/loader.d.ts.map +1 -0
- package/dist/runtime/config/loader.js +38 -0
- package/dist/runtime/config/loader.js.map +1 -0
- package/dist/runtime/config/schema.d.ts +202 -0
- package/dist/runtime/config/schema.d.ts.map +1 -0
- package/dist/runtime/config/schema.js +125 -0
- package/dist/runtime/config/schema.js.map +1 -0
- package/dist/runtime/env-seeder.d.ts +17 -0
- package/dist/runtime/env-seeder.d.ts.map +1 -0
- package/dist/runtime/env-seeder.js +80 -0
- package/dist/runtime/env-seeder.js.map +1 -0
- package/dist/runtime/foreground.d.ts +8 -0
- package/dist/runtime/foreground.d.ts.map +1 -0
- package/dist/runtime/foreground.js +71 -0
- package/dist/runtime/foreground.js.map +1 -0
- package/dist/runtime/infra/infra-catalog.d.ts +19 -0
- package/dist/runtime/infra/infra-catalog.d.ts.map +1 -0
- package/dist/runtime/infra/infra-catalog.js +128 -0
- package/dist/runtime/infra/infra-catalog.js.map +1 -0
- package/dist/runtime/infra/infra-plan.d.ts +16 -0
- package/dist/runtime/infra/infra-plan.d.ts.map +1 -0
- package/dist/runtime/infra/infra-plan.js +44 -0
- package/dist/runtime/infra/infra-plan.js.map +1 -0
- package/dist/runtime/infra/infra-runner.d.ts +26 -0
- package/dist/runtime/infra/infra-runner.d.ts.map +1 -0
- package/dist/runtime/infra/infra-runner.js +135 -0
- package/dist/runtime/infra/infra-runner.js.map +1 -0
- package/dist/runtime/launch.d.ts +24 -0
- package/dist/runtime/launch.d.ts.map +1 -0
- package/dist/runtime/launch.js +116 -0
- package/dist/runtime/launch.js.map +1 -0
- package/dist/runtime/lock-loader.d.ts +26 -0
- package/dist/runtime/lock-loader.d.ts.map +1 -0
- package/dist/runtime/lock-loader.js +61 -0
- package/dist/runtime/lock-loader.js.map +1 -0
- package/dist/runtime/paths.d.ts +14 -0
- package/dist/runtime/paths.d.ts.map +1 -0
- package/dist/runtime/paths.js +109 -0
- package/dist/runtime/paths.js.map +1 -0
- package/dist/runtime/platform-services.d.ts +2 -0
- package/dist/runtime/platform-services.d.ts.map +1 -0
- package/dist/runtime/platform-services.js +8 -0
- package/dist/runtime/platform-services.js.map +1 -0
- package/dist/runtime/port-map.d.ts +3 -0
- package/dist/runtime/port-map.d.ts.map +1 -0
- package/dist/runtime/port-map.js +25 -0
- package/dist/runtime/port-map.js.map +1 -0
- package/dist/runtime/roster.d.ts +32 -0
- package/dist/runtime/roster.d.ts.map +1 -0
- package/dist/runtime/roster.js +106 -0
- package/dist/runtime/roster.js.map +1 -0
- package/dist/runtime/runner/container-runner.d.ts +14 -0
- package/dist/runtime/runner/container-runner.d.ts.map +1 -0
- package/dist/runtime/runner/container-runner.js +61 -0
- package/dist/runtime/runner/container-runner.js.map +1 -0
- package/dist/runtime/runner/docker-cli.d.ts +11 -0
- package/dist/runtime/runner/docker-cli.d.ts.map +1 -0
- package/dist/runtime/runner/docker-cli.js +53 -0
- package/dist/runtime/runner/docker-cli.js.map +1 -0
- package/dist/runtime/runner/health-probe.d.ts +2 -0
- package/dist/runtime/runner/health-probe.d.ts.map +1 -0
- package/dist/runtime/runner/health-probe.js +38 -0
- package/dist/runtime/runner/health-probe.js.map +1 -0
- package/dist/runtime/runner/helm-runner.d.ts +19 -0
- package/dist/runtime/runner/helm-runner.d.ts.map +1 -0
- package/dist/runtime/runner/helm-runner.js +70 -0
- package/dist/runtime/runner/helm-runner.js.map +1 -0
- package/dist/runtime/runner/native-runner.d.ts +9 -0
- package/dist/runtime/runner/native-runner.d.ts.map +1 -0
- package/dist/runtime/runner/native-runner.js +85 -0
- package/dist/runtime/runner/native-runner.js.map +1 -0
- package/dist/runtime/runner/service-runner.d.ts +23 -0
- package/dist/runtime/runner/service-runner.d.ts.map +1 -0
- package/dist/runtime/runner/service-runner.js +10 -0
- package/dist/runtime/runner/service-runner.js.map +1 -0
- package/dist/runtime/supervisor.d.ts +46 -0
- package/dist/runtime/supervisor.d.ts.map +1 -0
- package/dist/runtime/supervisor.js +77 -0
- package/dist/runtime/supervisor.js.map +1 -0
- package/dist/runtime/unit-type.d.ts +9 -0
- package/dist/runtime/unit-type.d.ts.map +1 -0
- package/dist/runtime/unit-type.js +19 -0
- package/dist/runtime/unit-type.js.map +1 -0
- package/dist/runtime/waves.d.ts +15 -0
- package/dist/runtime/waves.d.ts.map +1 -0
- package/dist/runtime/waves.js +77 -0
- package/dist/runtime/waves.js.map +1 -0
- package/package.json +9 -10
- package/xema.config.example.yaml +45 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function findMonorepoRoot(startDir?: string): string | null;
|
|
2
|
+
export interface ArtifactResolution {
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly source: 'flag' | 'env' | 'vendored' | 'monorepo';
|
|
5
|
+
}
|
|
6
|
+
export interface ResolveArtifactOptions {
|
|
7
|
+
readonly explicit?: string | undefined;
|
|
8
|
+
readonly envVar?: string | undefined;
|
|
9
|
+
readonly edition: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function resolveDistributionLockPath(opts: ResolveArtifactOptions): ArtifactResolution;
|
|
12
|
+
export declare function resolveImageLockPath(opts: ResolveArtifactOptions): ArtifactResolution;
|
|
13
|
+
export declare function resolveBootGraphPath(opts: Omit<ResolveArtifactOptions, 'edition'>): ArtifactResolution;
|
|
14
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/runtime/paths.ts"],"names":[],"mappings":"AAqBA,wBAAgB,gBAAgB,CAAC,QAAQ,GAAE,MAAkB,GAAG,MAAM,GAAG,IAAI,CAY5E;AAQD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,UAAU,CAAC;CAC3D;AAED,MAAM,WAAW,sBAAsB;IAErC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAErC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAcD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,CA2B5F;AAGD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,CAwBrF;AAGD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC,GAAG,kBAAkB,CAwBtG"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findMonorepoRoot = findMonorepoRoot;
|
|
4
|
+
exports.resolveDistributionLockPath = resolveDistributionLockPath;
|
|
5
|
+
exports.resolveImageLockPath = resolveImageLockPath;
|
|
6
|
+
exports.resolveBootGraphPath = resolveBootGraphPath;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const MONOREPO_ROOT_MARKERS = ['pnpm-workspace.yaml', 'repos-infra/xema-distributions'];
|
|
10
|
+
function findMonorepoRoot(startDir = __dirname) {
|
|
11
|
+
let dir = startDir;
|
|
12
|
+
for (;;) {
|
|
13
|
+
if (MONOREPO_ROOT_MARKERS.every((m) => (0, node_fs_1.existsSync)((0, node_path_1.join)(dir, m)))) {
|
|
14
|
+
return dir;
|
|
15
|
+
}
|
|
16
|
+
const parent = (0, node_path_1.dirname)(dir);
|
|
17
|
+
if (parent === dir) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
dir = parent;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function vendoredAssetsDir() {
|
|
24
|
+
return (0, node_path_1.resolve)(__dirname, '..', 'assets');
|
|
25
|
+
}
|
|
26
|
+
function firstExisting(candidates) {
|
|
27
|
+
for (const c of candidates) {
|
|
28
|
+
if ((0, node_fs_1.existsSync)(c.path)) {
|
|
29
|
+
return { path: c.path, source: c.source };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
function resolveDistributionLockPath(opts) {
|
|
35
|
+
const monorepo = findMonorepoRoot();
|
|
36
|
+
const candidates = [];
|
|
37
|
+
if (opts.explicit) {
|
|
38
|
+
candidates.push({ path: absolutize(opts.explicit), source: 'flag' });
|
|
39
|
+
}
|
|
40
|
+
if (opts.envVar) {
|
|
41
|
+
candidates.push({ path: absolutize(opts.envVar), source: 'env' });
|
|
42
|
+
}
|
|
43
|
+
if (monorepo) {
|
|
44
|
+
candidates.push({
|
|
45
|
+
path: (0, node_path_1.join)(monorepo, 'repos-infra/xema-distributions', opts.edition, 'distribution.lock.json'),
|
|
46
|
+
source: 'monorepo',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
candidates.push({
|
|
50
|
+
path: (0, node_path_1.join)(vendoredAssetsDir(), opts.edition, 'distribution.lock.json'),
|
|
51
|
+
source: 'vendored',
|
|
52
|
+
});
|
|
53
|
+
const found = firstExisting(candidates);
|
|
54
|
+
if (!found) {
|
|
55
|
+
throw new Error(`Could not locate distribution.lock.json for edition "${opts.edition}". Tried:\n` +
|
|
56
|
+
candidates.map((c) => ` - ${c.path} (${c.source})`).join('\n'));
|
|
57
|
+
}
|
|
58
|
+
return found;
|
|
59
|
+
}
|
|
60
|
+
function resolveImageLockPath(opts) {
|
|
61
|
+
const monorepo = findMonorepoRoot();
|
|
62
|
+
const candidates = [];
|
|
63
|
+
if (opts.explicit) {
|
|
64
|
+
candidates.push({ path: absolutize(opts.explicit), source: 'flag' });
|
|
65
|
+
}
|
|
66
|
+
if (monorepo) {
|
|
67
|
+
candidates.push({
|
|
68
|
+
path: (0, node_path_1.join)(monorepo, 'repos-infra/xema-distributions', opts.edition, 'images.lock.json'),
|
|
69
|
+
source: 'monorepo',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
candidates.push({
|
|
73
|
+
path: (0, node_path_1.join)(vendoredAssetsDir(), opts.edition, 'images.lock.json'),
|
|
74
|
+
source: 'vendored',
|
|
75
|
+
});
|
|
76
|
+
const found = firstExisting(candidates);
|
|
77
|
+
if (!found) {
|
|
78
|
+
throw new Error(`Could not locate images.lock.json for edition "${opts.edition}". Tried:\n` +
|
|
79
|
+
candidates.map((c) => ` - ${c.path} (${c.source})`).join('\n'));
|
|
80
|
+
}
|
|
81
|
+
return found;
|
|
82
|
+
}
|
|
83
|
+
function resolveBootGraphPath(opts) {
|
|
84
|
+
const monorepo = findMonorepoRoot();
|
|
85
|
+
const candidates = [];
|
|
86
|
+
if (opts.explicit) {
|
|
87
|
+
candidates.push({ path: absolutize(opts.explicit), source: 'flag' });
|
|
88
|
+
}
|
|
89
|
+
if (opts.envVar) {
|
|
90
|
+
candidates.push({ path: absolutize(opts.envVar), source: 'env' });
|
|
91
|
+
}
|
|
92
|
+
if (monorepo) {
|
|
93
|
+
candidates.push({
|
|
94
|
+
path: (0, node_path_1.join)(monorepo, 'tooling/boundaries/boot-graph.json'),
|
|
95
|
+
source: 'monorepo',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
candidates.push({ path: (0, node_path_1.join)(vendoredAssetsDir(), 'boot-graph.json'), source: 'vendored' });
|
|
99
|
+
const found = firstExisting(candidates);
|
|
100
|
+
if (!found) {
|
|
101
|
+
throw new Error(`Could not locate boot-graph.json. Tried:\n` +
|
|
102
|
+
candidates.map((c) => ` - ${c.path} (${c.source})`).join('\n'));
|
|
103
|
+
}
|
|
104
|
+
return found;
|
|
105
|
+
}
|
|
106
|
+
function absolutize(p) {
|
|
107
|
+
return (0, node_path_1.isAbsolute)(p) ? p : (0, node_path_1.resolve)(process.cwd(), p);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/runtime/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-services.d.ts","sourceRoot":"","sources":["../../src/runtime/platform-services.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIlE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PLATFORM_SERVICE_PATHS = void 0;
|
|
4
|
+
exports.PLATFORM_SERVICE_PATHS = Object.freeze({
|
|
5
|
+
'xema-kernel-server': 'repos/xema-community/kernel/xema-kernel-server',
|
|
6
|
+
'xema-capability-router': 'repos/xema-community/biomes/xema-capability-router/api/xema-capability-router',
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=platform-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-services.js","sourceRoot":"","sources":["../../src/runtime/platform-services.ts"],"names":[],"mappings":";;;AAUa,QAAA,sBAAsB,GAAqC,MAAM,CAAC,MAAM,CAAC;IACpF,oBAAoB,EAAE,gDAAgD;IACtE,wBAAwB,EACtB,+EAA+E;CAClF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-map.d.ts","sourceRoot":"","sources":["../../src/runtime/port-map.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAW5C,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAmB/E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assignPorts = assignPorts;
|
|
4
|
+
const env_defaults_1 = require("../dev/env-defaults");
|
|
5
|
+
const FALLBACK_BASE = 7400;
|
|
6
|
+
function assignPorts(roster) {
|
|
7
|
+
const assigned = new Map();
|
|
8
|
+
let next = FALLBACK_BASE;
|
|
9
|
+
const used = new Set(Object.values(env_defaults_1.PORT_MAP));
|
|
10
|
+
for (const entry of [...roster].sort((a, b) => a.name.localeCompare(b.name))) {
|
|
11
|
+
const known = env_defaults_1.PORT_MAP[entry.name];
|
|
12
|
+
if (typeof known === 'number') {
|
|
13
|
+
assigned.set(entry.name, known);
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
while (used.has(next)) {
|
|
17
|
+
next += 1;
|
|
18
|
+
}
|
|
19
|
+
assigned.set(entry.name, next);
|
|
20
|
+
used.add(next);
|
|
21
|
+
next += 1;
|
|
22
|
+
}
|
|
23
|
+
return assigned;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=port-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-map.js","sourceRoot":"","sources":["../../src/runtime/port-map.ts"],"names":[],"mappings":";;AAaA,kCAmBC;AAhCD,sDAA+C;AAW/C,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,SAAgB,WAAW,CAAC,MAA8B;IACxD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,IAAI,IAAI,GAAG,aAAa,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,uBAAQ,CAAC,CAAC,CAAC;IAEtD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,KAAK,GAAG,uBAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,IAAI,CAAC,CAAC;QACZ,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,IAAI,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type RuntimeUnitType } from './unit-type';
|
|
2
|
+
import type { ImageEntry } from './lock-loader';
|
|
3
|
+
import type { DistributionLock } from '@xemahq/kernel-contracts/distribution';
|
|
4
|
+
export interface RosterEntry {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly tier: string;
|
|
7
|
+
readonly unitType: RuntimeUnitType;
|
|
8
|
+
readonly biomeId?: string;
|
|
9
|
+
readonly servicePath?: string;
|
|
10
|
+
readonly requiresServerBiomes: readonly string[];
|
|
11
|
+
readonly imageRef?: string;
|
|
12
|
+
readonly imageTag?: string;
|
|
13
|
+
}
|
|
14
|
+
export type RosterInclude = 'all' | {
|
|
15
|
+
readonly tiers?: readonly string[];
|
|
16
|
+
readonly services?: readonly string[];
|
|
17
|
+
};
|
|
18
|
+
export interface RosterSelection {
|
|
19
|
+
readonly include: RosterInclude;
|
|
20
|
+
readonly exclude?: readonly string[];
|
|
21
|
+
readonly pruned?: ReadonlySet<string>;
|
|
22
|
+
}
|
|
23
|
+
interface LockIndex {
|
|
24
|
+
readonly byName: ReadonlyMap<string, RosterEntry>;
|
|
25
|
+
readonly servicesByBiome: ReadonlyMap<string, readonly string[]>;
|
|
26
|
+
readonly requiresByBiome: ReadonlyMap<string, readonly string[]>;
|
|
27
|
+
readonly biomeByService: ReadonlyMap<string, string>;
|
|
28
|
+
}
|
|
29
|
+
export declare function buildLockIndex(lock: DistributionLock, imagesByBiome?: ReadonlyMap<string, ImageEntry>): LockIndex;
|
|
30
|
+
export declare function resolveRoster(lock: DistributionLock, selection: RosterSelection, imagesByBiome?: ReadonlyMap<string, ImageEntry>): RosterEntry[];
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=roster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../../src/runtime/roster.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,uCAAuC,CAAC;AAO3F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IAEnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IAEjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAMD,MAAM,MAAM,aAAa,GACrB,KAAK,GACL;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAErC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,UAAU,SAAS;IAEjB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAElD,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAEjE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAEjE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtD;AAGD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,gBAAgB,EACtB,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAC9C,SAAS,CAyCX;AAQD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,eAAe,EAC1B,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAC9C,WAAW,EAAE,CA+Cf"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildLockIndex = buildLockIndex;
|
|
4
|
+
exports.resolveRoster = resolveRoster;
|
|
5
|
+
const platform_services_1 = require("./platform-services");
|
|
6
|
+
const unit_type_1 = require("./unit-type");
|
|
7
|
+
function buildLockIndex(lock, imagesByBiome) {
|
|
8
|
+
const byName = new Map();
|
|
9
|
+
const servicesByBiome = new Map();
|
|
10
|
+
const requiresByBiome = new Map();
|
|
11
|
+
const biomeByService = new Map();
|
|
12
|
+
for (const biome of lock.biomes) {
|
|
13
|
+
servicesByBiome.set(biome.id, biome.services);
|
|
14
|
+
requiresByBiome.set(biome.id, biome.requiresServerBiomes ?? []);
|
|
15
|
+
const image = imagesByBiome?.get(biome.id);
|
|
16
|
+
for (const svc of biome.services) {
|
|
17
|
+
biomeByService.set(svc, biome.id);
|
|
18
|
+
if (!byName.has(svc)) {
|
|
19
|
+
const entry = {
|
|
20
|
+
name: svc,
|
|
21
|
+
tier: biome.tier,
|
|
22
|
+
unitType: (0, unit_type_1.classifyService)(svc, biome.tier),
|
|
23
|
+
biomeId: biome.id,
|
|
24
|
+
servicePath: `${biome.path}/api/${svc}`,
|
|
25
|
+
requiresServerBiomes: biome.requiresServerBiomes ?? [],
|
|
26
|
+
...(image !== undefined ? { imageRef: image.imageRef, imageTag: image.contentHash } : {}),
|
|
27
|
+
};
|
|
28
|
+
byName.set(svc, entry);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
for (const ps of lock.platformServices) {
|
|
33
|
+
if (!byName.has(ps.name)) {
|
|
34
|
+
const servicePath = platform_services_1.PLATFORM_SERVICE_PATHS[ps.name];
|
|
35
|
+
byName.set(ps.name, {
|
|
36
|
+
name: ps.name,
|
|
37
|
+
tier: ps.tier,
|
|
38
|
+
unitType: (0, unit_type_1.classifyService)(ps.name, ps.tier),
|
|
39
|
+
requiresServerBiomes: [],
|
|
40
|
+
...(servicePath !== undefined ? { servicePath } : {}),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { byName, servicesByBiome, requiresByBiome, biomeByService };
|
|
45
|
+
}
|
|
46
|
+
function resolveRoster(lock, selection, imagesByBiome) {
|
|
47
|
+
const index = buildLockIndex(lock, imagesByBiome);
|
|
48
|
+
let selected;
|
|
49
|
+
if (selection.include === 'all') {
|
|
50
|
+
selected = new Set(index.byName.keys());
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
selected = new Set();
|
|
54
|
+
const tiers = new Set(selection.include.tiers ?? []);
|
|
55
|
+
if (tiers.size > 0) {
|
|
56
|
+
for (const e of index.byName.values()) {
|
|
57
|
+
if (tiers.has(e.tier)) {
|
|
58
|
+
selected.add(e.name);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
for (const s of selection.include.services ?? []) {
|
|
63
|
+
if (index.byName.has(s)) {
|
|
64
|
+
selected.add(s);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
expandDependencyClosure(selected, index);
|
|
69
|
+
for (const ex of selection.exclude ?? []) {
|
|
70
|
+
selected.delete(ex);
|
|
71
|
+
}
|
|
72
|
+
for (const p of selection.pruned ?? []) {
|
|
73
|
+
selected.delete(p);
|
|
74
|
+
}
|
|
75
|
+
return [...selected]
|
|
76
|
+
.map((name) => {
|
|
77
|
+
const entry = index.byName.get(name);
|
|
78
|
+
if (!entry) {
|
|
79
|
+
throw new Error(`resolveRoster: selected service "${name}" missing from lock index.`);
|
|
80
|
+
}
|
|
81
|
+
return entry;
|
|
82
|
+
})
|
|
83
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
84
|
+
}
|
|
85
|
+
function expandDependencyClosure(selected, index) {
|
|
86
|
+
const queue = [...selected];
|
|
87
|
+
while (queue.length > 0) {
|
|
88
|
+
const svc = queue.shift();
|
|
89
|
+
if (svc === undefined) {
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
const biome = index.biomeByService.get(svc);
|
|
93
|
+
if (biome === undefined) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
for (const requiredBiome of index.requiresByBiome.get(biome) ?? []) {
|
|
97
|
+
for (const depSvc of index.servicesByBiome.get(requiredBiome) ?? []) {
|
|
98
|
+
if (!selected.has(depSvc)) {
|
|
99
|
+
selected.add(depSvc);
|
|
100
|
+
queue.push(depSvc);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=roster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roster.js","sourceRoot":"","sources":["../../src/runtime/roster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ServiceRunnerKind, type RunningService, type ServiceRunner, type StartServiceInput } from './service-runner';
|
|
2
|
+
export interface ContainerRunnerOptions {
|
|
3
|
+
readonly bin?: string;
|
|
4
|
+
readonly network: string;
|
|
5
|
+
readonly containerPort: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class ContainerRunner implements ServiceRunner {
|
|
8
|
+
private readonly opts;
|
|
9
|
+
readonly kind = ServiceRunnerKind.Container;
|
|
10
|
+
private readonly docker;
|
|
11
|
+
constructor(opts: ContainerRunnerOptions);
|
|
12
|
+
start(input: StartServiceInput): Promise<RunningService>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=container-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime/runner/container-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAY1B,MAAM,WAAW,sBAAsB;IAErC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,eAAgB,YAAW,aAAa;IAIvC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,QAAQ,CAAC,IAAI,+BAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEN,IAAI,EAAE,sBAAsB;IAInD,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;CAiD/D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ContainerRunner = void 0;
|
|
4
|
+
const docker_cli_1 = require("./docker-cli");
|
|
5
|
+
const health_probe_1 = require("./health-probe");
|
|
6
|
+
const service_runner_1 = require("./service-runner");
|
|
7
|
+
class ContainerRunner {
|
|
8
|
+
opts;
|
|
9
|
+
kind = service_runner_1.ServiceRunnerKind.Container;
|
|
10
|
+
docker;
|
|
11
|
+
constructor(opts) {
|
|
12
|
+
this.opts = opts;
|
|
13
|
+
this.docker = new docker_cli_1.DockerCli(opts.bin ?? 'docker');
|
|
14
|
+
}
|
|
15
|
+
async start(input) {
|
|
16
|
+
const { entry, env, port, readinessTimeoutMs } = input;
|
|
17
|
+
if (!entry.imageRef) {
|
|
18
|
+
throw new Error(`${entry.name}: no imageRef in images.lock.json — cannot run in the container substrate. ` +
|
|
19
|
+
`Re-resolve the edition's images.lock or use the native substrate.`);
|
|
20
|
+
}
|
|
21
|
+
const image = entry.imageTag ? `${entry.imageRef}:${entry.imageTag}` : entry.imageRef;
|
|
22
|
+
const args = [
|
|
23
|
+
'run',
|
|
24
|
+
'-d',
|
|
25
|
+
'--name',
|
|
26
|
+
entry.name,
|
|
27
|
+
'--label',
|
|
28
|
+
`${docker_cli_1.LAUNCHER_LABEL}=service`,
|
|
29
|
+
'--network',
|
|
30
|
+
this.opts.network,
|
|
31
|
+
'--restart',
|
|
32
|
+
'unless-stopped',
|
|
33
|
+
'-p',
|
|
34
|
+
`${String(port)}:${String(this.opts.containerPort)}`,
|
|
35
|
+
];
|
|
36
|
+
for (const [k, v] of Object.entries(env)) {
|
|
37
|
+
args.push('-e', `${k}=${v}`);
|
|
38
|
+
}
|
|
39
|
+
args.push(image);
|
|
40
|
+
const containerId = (await this.docker.run(args)).trim();
|
|
41
|
+
const url = `http://127.0.0.1:${String(port)}`;
|
|
42
|
+
try {
|
|
43
|
+
await (0, health_probe_1.waitForReady)(url, readinessTimeoutMs);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
await this.docker.runQuiet(['rm', '-f', entry.name]);
|
|
47
|
+
throw err;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
name: entry.name,
|
|
51
|
+
url,
|
|
52
|
+
handle: containerId.slice(0, 12),
|
|
53
|
+
close: async (graceMs) => {
|
|
54
|
+
await this.docker.runQuiet(['stop', '-t', String(Math.ceil(graceMs / 1000)), entry.name]);
|
|
55
|
+
await this.docker.runQuiet(['rm', '-f', entry.name]);
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.ContainerRunner = ContainerRunner;
|
|
61
|
+
//# sourceMappingURL=container-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-runner.js","sourceRoot":"","sources":["../../../src/runtime/runner/container-runner.ts"],"names":[],"mappings":";;;AAAA,6CAAyD;AACzD,iDAA8C;AAC9C,qDAK0B;AAqB1B,MAAa,eAAe;IAIG;IAHpB,IAAI,GAAG,kCAAiB,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAY;IAEnC,YAA6B,IAA4B;QAA5B,SAAI,GAAJ,IAAI,CAAwB;QACvD,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAS,CAAC,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAwB;QAClC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,CAAC,IAAI,6EAA6E;gBACxF,mEAAmE,CACtE,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;QAEtF,MAAM,IAAI,GAAG;YACX,KAAK;YACL,IAAI;YACJ,QAAQ;YACR,KAAK,CAAC,IAAI;YACV,SAAS;YACT,GAAG,2BAAc,UAAU;YAC3B,WAAW;YACX,IAAI,CAAC,IAAI,CAAC,OAAO;YACjB,WAAW;YACX,gBAAgB;YAChB,IAAI;YACJ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;SACrD,CAAC;QACF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjB,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,oBAAoB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,IAAA,2BAAY,EAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACrD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG;YACH,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAChC,KAAK,EAAE,KAAK,EAAE,OAAe,EAAiB,EAAE;gBAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1F,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAzDD,0CAyDC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const LAUNCHER_LABEL = "xema.launcher";
|
|
2
|
+
export declare class DockerCli {
|
|
3
|
+
private readonly bin;
|
|
4
|
+
constructor(bin?: string);
|
|
5
|
+
run(args: readonly string[]): Promise<string>;
|
|
6
|
+
runQuiet(args: readonly string[]): Promise<string>;
|
|
7
|
+
available(): Promise<boolean>;
|
|
8
|
+
ensureNetwork(name: string): Promise<void>;
|
|
9
|
+
launcherContainers(): Promise<string[]>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=docker-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-cli.d.ts","sourceRoot":"","sources":["../../../src/runtime/runner/docker-cli.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAE9C,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,GAAE,MAAiB;IAEnD,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAavC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IASlD,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAM7B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1C,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAW9C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DockerCli = exports.LAUNCHER_LABEL = void 0;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
exports.LAUNCHER_LABEL = 'xema.launcher';
|
|
6
|
+
class DockerCli {
|
|
7
|
+
bin;
|
|
8
|
+
constructor(bin = 'docker') {
|
|
9
|
+
this.bin = bin;
|
|
10
|
+
}
|
|
11
|
+
run(args) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
(0, node_child_process_1.execFile)(this.bin, [...args], { maxBuffer: 32 * 1024 * 1024 }, (err, stdout, stderr) => {
|
|
14
|
+
if (err) {
|
|
15
|
+
reject(new Error(`${this.bin} ${args.join(' ')} failed: ${stderr || err.message}`));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
resolve(stdout);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async runQuiet(args) {
|
|
23
|
+
try {
|
|
24
|
+
return await this.run(args);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return '';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async available() {
|
|
31
|
+
const out = await this.runQuiet(['version', '--format', '{{.Server.Version}}']);
|
|
32
|
+
return out.trim().length > 0;
|
|
33
|
+
}
|
|
34
|
+
async ensureNetwork(name) {
|
|
35
|
+
const existing = await this.runQuiet(['network', 'ls', '--filter', `name=^${name}$`, '--format', '{{.Name}}']);
|
|
36
|
+
if (!existing.split('\n').map((l) => l.trim()).includes(name)) {
|
|
37
|
+
await this.runQuiet(['network', 'create', name]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async launcherContainers() {
|
|
41
|
+
const out = await this.runQuiet([
|
|
42
|
+
'ps',
|
|
43
|
+
'-a',
|
|
44
|
+
'--filter',
|
|
45
|
+
`label=${exports.LAUNCHER_LABEL}`,
|
|
46
|
+
'--format',
|
|
47
|
+
'{{.Names}}',
|
|
48
|
+
]);
|
|
49
|
+
return out.split('\n').map((l) => l.trim()).filter((l) => l.length > 0);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.DockerCli = DockerCli;
|
|
53
|
+
//# sourceMappingURL=docker-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-cli.js","sourceRoot":"","sources":["../../../src/runtime/runner/docker-cli.ts"],"names":[],"mappings":";;;AAAA,2DAA8C;AAUjC,QAAA,cAAc,GAAG,eAAe,CAAC;AAE9C,MAAa,SAAS;IACS;IAA7B,YAA6B,MAAc,QAAQ;QAAtB,QAAG,GAAH,GAAG,CAAmB;IAAG,CAAC;IAEvD,GAAG,CAAC,IAAuB;QACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAA,6BAAQ,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACrF,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACpF,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAGD,KAAK,CAAC,QAAQ,CAAC,IAAuB;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,SAAS;QACb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAChF,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IAGD,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,IAAI,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QAC/G,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,kBAAkB;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;YAC9B,IAAI;YACJ,IAAI;YACJ,UAAU;YACV,SAAS,sBAAc,EAAE;YACzB,UAAU;YACV,YAAY;SACb,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1E,CAAC;CACF;AAlDD,8BAkDC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-probe.d.ts","sourceRoot":"","sources":["../../../src/runtime/runner/health-probe.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,SAAM,EAChB,OAAO,CAAC,EAAE,MAAM,OAAO,GACtB,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.waitForReady = waitForReady;
|
|
4
|
+
const node_http_1 = require("node:http");
|
|
5
|
+
async function waitForReady(baseUrl, timeoutMs, intervalMs = 300, isAlive) {
|
|
6
|
+
const deadline = Date.now() + timeoutMs;
|
|
7
|
+
for (;;) {
|
|
8
|
+
if (isAlive && !isAlive()) {
|
|
9
|
+
throw new Error(`process exited before becoming ready`);
|
|
10
|
+
}
|
|
11
|
+
if (await probeOnce(`${baseUrl}/health/ready`)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (Date.now() >= deadline) {
|
|
15
|
+
throw new Error(`readiness timeout after ${String(timeoutMs)}ms (${baseUrl}/health/ready)`);
|
|
16
|
+
}
|
|
17
|
+
await delay(intervalMs);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function probeOnce(url) {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const req = (0, node_http_1.get)(url, (res) => {
|
|
23
|
+
res.resume();
|
|
24
|
+
resolve(res.statusCode === 200);
|
|
25
|
+
});
|
|
26
|
+
req.on('error', () => resolve(false));
|
|
27
|
+
req.setTimeout(2000, () => {
|
|
28
|
+
req.destroy();
|
|
29
|
+
resolve(false);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function delay(ms) {
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
setTimeout(resolve, ms);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=health-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-probe.js","sourceRoot":"","sources":["../../../src/runtime/runner/health-probe.ts"],"names":[],"mappings":";;AAMA,oCAmBC;AAzBD,yCAA2C;AAMpC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,SAAiB,EACjB,UAAU,GAAG,GAAG,EAChB,OAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC;QACR,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,MAAM,SAAS,CAAC,GAAG,OAAO,eAAe,CAAC,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,SAAS,CAAC,OAAO,OAAO,gBAAgB,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;YAC/B,GAAG,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;YACxB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ServiceRunnerKind, type RunningService, type ServiceRunner, type StartServiceInput } from './service-runner';
|
|
2
|
+
export interface HelmRunnerOptions {
|
|
3
|
+
readonly chartRepo?: string;
|
|
4
|
+
readonly namespace?: string;
|
|
5
|
+
readonly kubeconfig?: string;
|
|
6
|
+
readonly waitTimeout?: string;
|
|
7
|
+
readonly bin?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class HelmRunner implements ServiceRunner {
|
|
10
|
+
private readonly opts;
|
|
11
|
+
readonly kind = ServiceRunnerKind.Helm;
|
|
12
|
+
private readonly bin;
|
|
13
|
+
private readonly namespace;
|
|
14
|
+
private readonly chartRepo;
|
|
15
|
+
constructor(opts?: HelmRunnerOptions);
|
|
16
|
+
start(input: StartServiceInput): Promise<RunningService>;
|
|
17
|
+
private helm;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=helm-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helm-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime/runner/helm-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAc1B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,qBAAa,UAAW,YAAW,aAAa;IAMlC,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,QAAQ,CAAC,IAAI,0BAA0B;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEN,IAAI,GAAE,iBAAsB;IAMnD,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAmC9D,OAAO,CAAC,IAAI;CAeb"}
|