@bluewombat/runtime 0.8.0 → 0.9.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 +124 -100
- package/SPECS.md +103 -84
- package/dist/cli.js +32 -34
- package/dist/cli.js.map +1 -1
- package/dist/config/agent-shorthand.d.ts +0 -1
- package/dist/config/agent-shorthand.d.ts.map +1 -1
- package/dist/config/agent-shorthand.js +1 -9
- package/dist/config/agent-shorthand.js.map +1 -1
- package/dist/config/defaults.d.ts +0 -2
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +0 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/find-config.d.ts +3 -2
- package/dist/config/find-config.d.ts.map +1 -1
- package/dist/config/find-config.js +4 -4
- package/dist/config/find-config.js.map +1 -1
- package/dist/config/home.js +2 -2
- package/dist/config/home.js.map +1 -1
- package/dist/config/load-config.d.ts +2 -2
- package/dist/config/load-config.d.ts.map +1 -1
- package/dist/config/load-config.js +46 -29
- package/dist/config/load-config.js.map +1 -1
- package/dist/config/parse-args.d.ts.map +1 -1
- package/dist/config/parse-args.js +50 -48
- package/dist/config/parse-args.js.map +1 -1
- package/dist/config/types.d.ts +40 -24
- package/dist/config/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loop/authority.d.ts +3 -4
- package/dist/loop/authority.d.ts.map +1 -1
- package/dist/loop/authority.js +27 -22
- package/dist/loop/authority.js.map +1 -1
- package/dist/loop/context.d.ts +8 -3
- package/dist/loop/context.d.ts.map +1 -1
- package/dist/loop/deliveries.d.ts +16 -16
- package/dist/loop/deliveries.d.ts.map +1 -1
- package/dist/loop/deliveries.js +35 -187
- package/dist/loop/deliveries.js.map +1 -1
- package/dist/loop/describe.d.ts +4 -6
- package/dist/loop/describe.d.ts.map +1 -1
- package/dist/loop/describe.js +2 -2
- package/dist/loop/describe.js.map +1 -1
- package/dist/loop/drive.d.ts +4 -6
- package/dist/loop/drive.d.ts.map +1 -1
- package/dist/loop/drive.js +9 -33
- package/dist/loop/drive.js.map +1 -1
- package/dist/loop/features.d.ts +23 -0
- package/dist/loop/features.d.ts.map +1 -0
- package/dist/loop/features.js +571 -0
- package/dist/loop/features.js.map +1 -0
- package/dist/loop/journal.d.ts +1 -1
- package/dist/loop/journal.js +2 -2
- package/dist/loop/journal.js.map +1 -1
- package/dist/loop/lock.d.ts +1 -1
- package/dist/loop/lock.js +1 -1
- package/dist/loop/open-host.d.ts.map +1 -1
- package/dist/loop/open-host.js +23 -24
- package/dist/loop/open-host.js.map +1 -1
- package/dist/loop/probe.d.ts +1 -1
- package/dist/loop/probe.d.ts.map +1 -1
- package/dist/loop/probe.js +51 -22
- package/dist/loop/probe.js.map +1 -1
- package/dist/loop/process-tree.d.ts +1 -1
- package/dist/loop/process-tree.js +1 -1
- package/dist/loop/report.d.ts +9 -7
- package/dist/loop/report.d.ts.map +1 -1
- package/dist/loop/report.js +30 -99
- package/dist/loop/report.js.map +1 -1
- package/dist/loop/streams.d.ts +5 -5
- package/dist/loop/streams.d.ts.map +1 -1
- package/dist/loop/streams.js +3 -3
- package/dist/loop/streams.js.map +1 -1
- package/dist/loop/tick.d.ts +6 -4
- package/dist/loop/tick.d.ts.map +1 -1
- package/dist/loop/tick.js +50 -78
- package/dist/loop/tick.js.map +1 -1
- package/dist/loop/trace.d.ts +5 -5
- package/dist/loop/trace.d.ts.map +1 -1
- package/dist/loop/trace.js +5 -14
- package/dist/loop/trace.js.map +1 -1
- package/dist/loop/transformers.d.ts +3 -13
- package/dist/loop/transformers.d.ts.map +1 -1
- package/dist/loop/transformers.js +3 -53
- package/dist/loop/transformers.js.map +1 -1
- package/dist/loop/warm.d.ts +3 -3
- package/dist/loop/warm.js +3 -3
- package/dist/loop/work-line.d.ts +1 -1
- package/dist/operator/agent-plugins.d.ts +11 -0
- package/dist/operator/agent-plugins.d.ts.map +1 -1
- package/dist/operator/agent-plugins.js +3 -3
- package/dist/operator/agent-plugins.js.map +1 -1
- package/dist/operator/board.d.ts +3 -8
- package/dist/operator/board.d.ts.map +1 -1
- package/dist/operator/board.js +2 -11
- package/dist/operator/board.js.map +1 -1
- package/dist/operator/cancel.d.ts +2 -2
- package/dist/operator/cancel.js +6 -6
- package/dist/operator/cancel.js.map +1 -1
- package/dist/operator/doctor.d.ts +9 -0
- package/dist/operator/doctor.d.ts.map +1 -1
- package/dist/operator/doctor.js +32 -25
- package/dist/operator/doctor.js.map +1 -1
- package/dist/operator/explain.d.ts +76 -0
- package/dist/operator/explain.d.ts.map +1 -0
- package/dist/operator/explain.js +556 -0
- package/dist/operator/explain.js.map +1 -0
- package/dist/operator/film.d.ts +3 -11
- package/dist/operator/film.d.ts.map +1 -1
- package/dist/operator/film.js +8 -90
- package/dist/operator/film.js.map +1 -1
- package/dist/operator/init.d.ts.map +1 -1
- package/dist/operator/init.js +41 -49
- package/dist/operator/init.js.map +1 -1
- package/dist/operator/live.js +1 -1
- package/dist/operator/live.js.map +1 -1
- package/dist/operator/log.js +3 -4
- package/dist/operator/log.js.map +1 -1
- package/dist/operator/release.d.ts +2 -2
- package/dist/operator/release.js +7 -7
- package/dist/operator/release.js.map +1 -1
- package/dist/operator/run.d.ts +25 -0
- package/dist/operator/run.d.ts.map +1 -0
- package/dist/operator/run.js +70 -0
- package/dist/operator/run.js.map +1 -0
- package/dist/operator/setup.d.ts.map +1 -1
- package/dist/operator/setup.js +20 -16
- package/dist/operator/setup.js.map +1 -1
- package/dist/plugins/manager.d.ts +33 -2
- package/dist/plugins/manager.d.ts.map +1 -1
- package/dist/plugins/manager.js +67 -0
- package/dist/plugins/manager.js.map +1 -1
- package/package.json +15 -16
package/dist/operator/release.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CLI_NAME } from "@bluewombat/manager-kit";
|
|
2
2
|
import { parseArgs } from "../config/parse-args.js";
|
|
3
3
|
import { openHost } from "../loop/open-host.js";
|
|
4
4
|
/**
|
|
5
|
-
* Drop a held
|
|
5
|
+
* Drop a held unit by key without waiting for the bail clock.
|
|
6
6
|
*
|
|
7
|
-
* The hatch after a crash left a
|
|
7
|
+
* The hatch after a crash left a unit `running` with nobody on it. A clean
|
|
8
8
|
* stop releases itself; this is for when the process never wrote that. Takes
|
|
9
9
|
* the ledger lock: stop `run` first if it holds it.
|
|
10
10
|
*/
|
|
11
11
|
export async function runRelease(input) {
|
|
12
12
|
const peeled = peelKey(input.argv);
|
|
13
13
|
if (peeled.key === undefined) {
|
|
14
|
-
input.write(`Usage: ${
|
|
14
|
+
input.write(`Usage: ${CLI_NAME} release <key>\n`);
|
|
15
15
|
return 2;
|
|
16
16
|
}
|
|
17
17
|
const { key } = peeled;
|
|
@@ -36,12 +36,12 @@ export async function runRelease(input) {
|
|
|
36
36
|
}
|
|
37
37
|
switch (result.code) {
|
|
38
38
|
case "not-found":
|
|
39
|
-
input.write(`No
|
|
39
|
+
input.write(`No Ticket named "${key}" in the ledger.\n`);
|
|
40
40
|
return 2;
|
|
41
41
|
case "illegal-transition":
|
|
42
42
|
input.write(result.state === undefined
|
|
43
|
-
? "Too late: that
|
|
44
|
-
: `Too late: that
|
|
43
|
+
? "Too late: that Ticket cannot be released.\n"
|
|
44
|
+
: `Too late: that Ticket is ${result.state}.\n`);
|
|
45
45
|
return 1;
|
|
46
46
|
}
|
|
47
47
|
return 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/operator/release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/operator/release.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { HostOptions } from "../config/types.js";
|
|
2
|
+
import type { Host } from "../loop/tick.js";
|
|
3
|
+
export type RunInput = {
|
|
4
|
+
cwd: string;
|
|
5
|
+
argv: string[];
|
|
6
|
+
/** Where the run says what it is doing: stdout. */
|
|
7
|
+
write: (text: string) => void;
|
|
8
|
+
/** Where a failure is explained: stderr. */
|
|
9
|
+
writeError: (text: string) => void;
|
|
10
|
+
interruptFlag: {
|
|
11
|
+
interrupted: boolean;
|
|
12
|
+
};
|
|
13
|
+
/** Tests hand a Host that needs no tracker. */
|
|
14
|
+
open?: (options: HostOptions) => Promise<Pick<Host, "run" | "close">>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* `mason run`: drain the tracker, run Conductor, report.
|
|
18
|
+
*
|
|
19
|
+
* It speaks before it does anything, and again at every step that can take a
|
|
20
|
+
* while or fail: with nothing on the terminal there is no telling a run that
|
|
21
|
+
* is starting from one that crashed. Whatever happens, the last line says that
|
|
22
|
+
* it stopped and why.
|
|
23
|
+
*/
|
|
24
|
+
export declare function runRun(input: RunInput): Promise<number>;
|
|
25
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/operator/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mDAAmD;IACnD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,4CAA4C;IAC5C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,aAAa,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;IACxC,+CAA+C;IAC/C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;CACvE,CAAC;AAaF;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CA2D7D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { parseArgs } from "../config/parse-args.js";
|
|
2
|
+
import { openHost } from "../loop/open-host.js";
|
|
3
|
+
import { openTrace } from "../loop/trace.js";
|
|
4
|
+
/** The width the other trace lines (`listen`, `feature`, `work line`) pad their label to. */
|
|
5
|
+
const LABEL = 11;
|
|
6
|
+
function say(label, text) {
|
|
7
|
+
return `${label.padEnd(LABEL)}${text}`;
|
|
8
|
+
}
|
|
9
|
+
function nameOf(spec) {
|
|
10
|
+
return typeof spec.package === "string" ? spec.package : "(a module)";
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* `mason run`: drain the tracker, run Conductor, report.
|
|
14
|
+
*
|
|
15
|
+
* It speaks before it does anything, and again at every step that can take a
|
|
16
|
+
* while or fail: with nothing on the terminal there is no telling a run that
|
|
17
|
+
* is starting from one that crashed. Whatever happens, the last line says that
|
|
18
|
+
* it stopped and why.
|
|
19
|
+
*/
|
|
20
|
+
export async function runRun(input) {
|
|
21
|
+
const trace = openTrace(input.write);
|
|
22
|
+
trace(say("run", "starting"));
|
|
23
|
+
const parsed = parseArgs(input.argv, { cwd: input.cwd });
|
|
24
|
+
if (!parsed.ok) {
|
|
25
|
+
input.writeError(`${parsed.reason}\n`);
|
|
26
|
+
trace(say("stopped", "not started, exit 2"));
|
|
27
|
+
return 2;
|
|
28
|
+
}
|
|
29
|
+
const invocation = parsed.invocation;
|
|
30
|
+
trace(say("config", invocation.configDir));
|
|
31
|
+
trace(say("trackers", `features ${nameOf(invocation.featureTracker)}, tickets ${nameOf(invocation.ticketTracker)}`));
|
|
32
|
+
trace(say("ledger", invocation.ledgerRoot));
|
|
33
|
+
trace(say("poll", invocation.pollIntervalMs === undefined
|
|
34
|
+
? "once, then stop"
|
|
35
|
+
: `every ${Math.round(invocation.pollIntervalMs / 1000)}s`));
|
|
36
|
+
const options = {
|
|
37
|
+
...invocation,
|
|
38
|
+
interruptFlag: input.interruptFlag,
|
|
39
|
+
write: input.write,
|
|
40
|
+
};
|
|
41
|
+
const open = input.open ?? openHost;
|
|
42
|
+
let host;
|
|
43
|
+
try {
|
|
44
|
+
trace(say("opening", "ledger, lock, work line and trackers"));
|
|
45
|
+
host = await open(options);
|
|
46
|
+
trace(say("started", `pid ${process.pid}, Ctrl-C to stop`));
|
|
47
|
+
const result = await host.run();
|
|
48
|
+
// An interrupt mid-Delivery leaves that run `refused` too: it is still an interrupt.
|
|
49
|
+
if (input.interruptFlag.interrupted) {
|
|
50
|
+
trace(say("stopped", "interrupted, exit 130"));
|
|
51
|
+
return 130;
|
|
52
|
+
}
|
|
53
|
+
if (result.lastRun?.outcome === "refused") {
|
|
54
|
+
trace(say("stopped", "the last run was refused, exit 1"));
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
trace(say("stopped", "finished"));
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
62
|
+
input.writeError(`${message}\n`);
|
|
63
|
+
trace(say("stopped", "failed, exit 2"));
|
|
64
|
+
return 2;
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
await host?.close();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/operator/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/operator/setup.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C,CAAC;AASF;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/operator/setup.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C,CAAC;AASF;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAmDjE"}
|
package/dist/operator/setup.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CLI_NAME } from "@bluewombat/manager-kit";
|
|
2
2
|
import { parseArgs } from "../config/parse-args.js";
|
|
3
|
-
import { contextOf, loadManagerModule } from "../plugins/manager.js";
|
|
3
|
+
import { contextOf, distinctManagers, loadManagerModule, requestOf } from "../plugins/manager.js";
|
|
4
4
|
const MARKS = {
|
|
5
5
|
satisfied: "ok ",
|
|
6
6
|
missing: "todo",
|
|
@@ -23,28 +23,32 @@ export async function runSetup(input) {
|
|
|
23
23
|
return 2;
|
|
24
24
|
}
|
|
25
25
|
const invocation = parsed.invocation;
|
|
26
|
-
const
|
|
27
|
-
manager: invocation.manager,
|
|
28
|
-
managerOptions: invocation.managerOptions,
|
|
26
|
+
const common = {
|
|
29
27
|
configDir: invocation.configDir,
|
|
30
28
|
durationMs: invocation.timeoutMs,
|
|
31
29
|
interruptFlag: input.interruptFlag ?? { interrupted: false },
|
|
32
30
|
env: input.env,
|
|
33
31
|
};
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
32
|
+
const steps = [];
|
|
33
|
+
for (const one of distinctManagers(invocation)) {
|
|
34
|
+
const request = requestOf(one.spec, common, one.sides);
|
|
35
|
+
const loaded = await loadManagerModule(request);
|
|
36
|
+
if (!loaded.ok) {
|
|
37
|
+
input.write(`${loaded.reason}\n`);
|
|
38
|
+
return 2;
|
|
39
|
+
}
|
|
40
|
+
if (loaded.module.setupManager === undefined) {
|
|
41
|
+
input.write(`${String(one.spec.package)} has nothing to set up.\n`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const result = await loaded.module.setupManager(contextOf(request), { apply });
|
|
45
|
+
steps.push(...result.steps);
|
|
42
46
|
}
|
|
43
|
-
const
|
|
44
|
-
for (const step of result.steps) {
|
|
47
|
+
for (const step of steps) {
|
|
45
48
|
const detail = step.detail === undefined ? "" : ` — ${step.detail}`;
|
|
46
49
|
input.write(`${MARKS[step.state]} ${step.summary}${detail}\n`);
|
|
47
50
|
}
|
|
51
|
+
const result = { steps };
|
|
48
52
|
const blocked = result.steps.filter((step) => step.state === "blocked").length;
|
|
49
53
|
if (blocked > 0) {
|
|
50
54
|
input.write(`\n${blocked} step(s) blocked.\n`);
|
|
@@ -52,7 +56,7 @@ export async function runSetup(input) {
|
|
|
52
56
|
}
|
|
53
57
|
const missing = result.steps.filter((step) => step.state === "missing").length;
|
|
54
58
|
if (missing > 0) {
|
|
55
|
-
input.write(`\n${missing} step(s) to apply. Run: ${
|
|
59
|
+
input.write(`\n${missing} step(s) to apply. Run: ${CLI_NAME} setup --apply\n`);
|
|
56
60
|
return 0;
|
|
57
61
|
}
|
|
58
62
|
const applied = result.steps.filter((step) => step.state === "applied").length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/operator/setup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/operator/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { ManagerContext, ManagerModule,
|
|
1
|
+
import type { FeatureTrackerPort, Manager, ManagerContext, ManagerModule, ManagerSide, TicketTrackerPort } from "@bluewombat/manager-kit";
|
|
2
|
+
import type { ManagerSpec } from "../config/types.js";
|
|
2
3
|
export type ResolveResult = {
|
|
3
4
|
ok: true;
|
|
4
5
|
module: ManagerModule;
|
|
@@ -18,6 +19,8 @@ export type ManagerRequest = {
|
|
|
18
19
|
interrupted: boolean;
|
|
19
20
|
};
|
|
20
21
|
env: Record<string, string | undefined>;
|
|
22
|
+
/** The sides this manager is built for; absent means both. */
|
|
23
|
+
sides?: readonly Side[];
|
|
21
24
|
};
|
|
22
25
|
export type LoadedModule = {
|
|
23
26
|
ok: true;
|
|
@@ -35,7 +38,35 @@ export declare function loadManagerModule(request: ManagerRequest): Promise<Load
|
|
|
35
38
|
*/
|
|
36
39
|
export declare function openManager(request: ManagerRequest): Promise<{
|
|
37
40
|
ok: true;
|
|
38
|
-
manager:
|
|
41
|
+
manager: Manager;
|
|
42
|
+
} | {
|
|
43
|
+
ok: false;
|
|
44
|
+
reason: string;
|
|
45
|
+
}>;
|
|
46
|
+
export type Side = ManagerSide;
|
|
47
|
+
export type ManagerSides = Record<Side, ManagerSpec<string | ManagerModule>>;
|
|
48
|
+
export type DistinctManager = {
|
|
49
|
+
/** The sides this one manager answers: both when the config names it twice alike. */
|
|
50
|
+
sides: Side[];
|
|
51
|
+
spec: ManagerSpec<string | ManagerModule>;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* The managers behind the two sides. One package with one set of options is one
|
|
55
|
+
* manager, built once, so a tracker that holds both is not read through two
|
|
56
|
+
* clients.
|
|
57
|
+
*/
|
|
58
|
+
export declare function distinctManagers(sides: ManagerSides): DistinctManager[];
|
|
59
|
+
/** What a side is called in a message a person reads. */
|
|
60
|
+
export declare function nameOfSides(sides: Side[]): string;
|
|
61
|
+
export declare function requestOf(spec: ManagerSpec<string | ManagerModule>, common: Omit<ManagerRequest, "manager" | "managerOptions" | "sides">, sides?: readonly Side[]): ManagerRequest;
|
|
62
|
+
/**
|
|
63
|
+
* Build the Port of each side. A package asked for a side it does not answer
|
|
64
|
+
* is refused by name: a run needs Features to read and Tickets to make.
|
|
65
|
+
*/
|
|
66
|
+
export declare function openManagers(sides: ManagerSides, common: Omit<ManagerRequest, "manager" | "managerOptions" | "sides">): Promise<{
|
|
67
|
+
ok: true;
|
|
68
|
+
features: FeatureTrackerPort;
|
|
69
|
+
tickets: TicketTrackerPort;
|
|
39
70
|
} | {
|
|
40
71
|
ok: false;
|
|
41
72
|
reason: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/plugins/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/plugins/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/plugins/manager.js
CHANGED
|
@@ -23,6 +23,7 @@ export function contextOf(request) {
|
|
|
23
23
|
interruptFlag: request.interruptFlag,
|
|
24
24
|
configDir: request.configDir,
|
|
25
25
|
env: request.env,
|
|
26
|
+
...(request.sides !== undefined ? { sides: request.sides } : {}),
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
/** The module face, so `mason doctor` can ask a manager to check itself. */
|
|
@@ -44,4 +45,70 @@ export async function openManager(request) {
|
|
|
44
45
|
}
|
|
45
46
|
return await loaded.module.createManager(contextOf(request));
|
|
46
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* The managers behind the two sides. One package with one set of options is one
|
|
50
|
+
* manager, built once, so a tracker that holds both is not read through two
|
|
51
|
+
* clients.
|
|
52
|
+
*/
|
|
53
|
+
export function distinctManagers(sides) {
|
|
54
|
+
const { featureTracker, ticketTracker } = sides;
|
|
55
|
+
if (featureTracker.package === ticketTracker.package &&
|
|
56
|
+
JSON.stringify(featureTracker.options) === JSON.stringify(ticketTracker.options)) {
|
|
57
|
+
return [{ sides: ["featureTracker", "ticketTracker"], spec: featureTracker }];
|
|
58
|
+
}
|
|
59
|
+
return [
|
|
60
|
+
{ sides: ["featureTracker"], spec: featureTracker },
|
|
61
|
+
{ sides: ["ticketTracker"], spec: ticketTracker },
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
/** What a side is called in a message a person reads. */
|
|
65
|
+
export function nameOfSides(sides) {
|
|
66
|
+
return sides.length === 2
|
|
67
|
+
? "feature tracker and ticket tracker"
|
|
68
|
+
: sides[0] === "featureTracker"
|
|
69
|
+
? "feature tracker"
|
|
70
|
+
: "ticket tracker";
|
|
71
|
+
}
|
|
72
|
+
export function requestOf(spec, common, sides) {
|
|
73
|
+
return {
|
|
74
|
+
...common,
|
|
75
|
+
manager: spec.package,
|
|
76
|
+
managerOptions: spec.options,
|
|
77
|
+
...(sides !== undefined ? { sides } : {}),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Build the Port of each side. A package asked for a side it does not answer
|
|
82
|
+
* is refused by name: a run needs Features to read and Tickets to make.
|
|
83
|
+
*/
|
|
84
|
+
export async function openManagers(sides, common) {
|
|
85
|
+
const built = {};
|
|
86
|
+
for (const one of distinctManagers(sides)) {
|
|
87
|
+
const opened = await openManager(requestOf(one.spec, common, one.sides));
|
|
88
|
+
if (!opened.ok) {
|
|
89
|
+
return opened;
|
|
90
|
+
}
|
|
91
|
+
for (const side of one.sides) {
|
|
92
|
+
built[side] = opened.manager;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const features = built.featureTracker?.features;
|
|
96
|
+
if (features === undefined) {
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
reason: `${nameOf(sides.featureTracker)} answers no FeatureTracker, and "featureTracker" must name a package that does.`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const tickets = built.ticketTracker?.tickets;
|
|
103
|
+
if (tickets === undefined) {
|
|
104
|
+
return {
|
|
105
|
+
ok: false,
|
|
106
|
+
reason: `${nameOf(sides.ticketTracker)} answers no TicketTracker, and "ticketTracker" must name a package that does.`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return { ok: true, features, tickets };
|
|
110
|
+
}
|
|
111
|
+
function nameOf(spec) {
|
|
112
|
+
return typeof spec.package === "string" ? spec.package : "the manager";
|
|
113
|
+
}
|
|
47
114
|
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/plugins/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/plugins/manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bluewombat/runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "The mason process: listen, admit, run Conductor, report. Loads one
|
|
5
|
+
"description": "The mason process: listen, admit, run Conductor, report. Loads one TicketTracker plugin.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"mason",
|
|
8
8
|
"bluewombat",
|
|
@@ -46,22 +46,21 @@
|
|
|
46
46
|
"build": "tsc -p tsconfig.build.json"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@bluewombat/conductor": "^0.
|
|
50
|
-
"@bluewombat/
|
|
51
|
-
"@bluewombat/
|
|
52
|
-
"@bluewombat/
|
|
53
|
-
"@bluewombat/
|
|
54
|
-
"@bluewombat/isolation-
|
|
55
|
-
"@bluewombat/
|
|
56
|
-
"@bluewombat/
|
|
57
|
-
"@bluewombat/
|
|
58
|
-
"@bluewombat/
|
|
59
|
-
"@bluewombat/persist-fs": "^0.8.0",
|
|
49
|
+
"@bluewombat/conductor": "^0.9.0",
|
|
50
|
+
"@bluewombat/manager-kit": "^0.9.0",
|
|
51
|
+
"@bluewombat/implementer": "^0.9.0",
|
|
52
|
+
"@bluewombat/integrator": "^0.9.0",
|
|
53
|
+
"@bluewombat/isolation-copy": "^0.9.0",
|
|
54
|
+
"@bluewombat/isolation-git": "^0.9.0",
|
|
55
|
+
"@bluewombat/isolator": "^0.9.0",
|
|
56
|
+
"@bluewombat/slots": "^0.9.0",
|
|
57
|
+
"@bluewombat/work-ledger": "^0.9.0",
|
|
58
|
+
"@bluewombat/persist-fs": "^0.9.0",
|
|
60
59
|
"yaml": "^2.9.1"
|
|
61
60
|
},
|
|
62
61
|
"devDependencies": {
|
|
63
|
-
"@bluewombat/manager-fake": "^0.
|
|
64
|
-
"@bluewombat/manager-github": "^0.
|
|
65
|
-
"@bluewombat/persist-sqlite": "^0.
|
|
62
|
+
"@bluewombat/manager-fake": "^0.9.0",
|
|
63
|
+
"@bluewombat/manager-github": "^0.9.0",
|
|
64
|
+
"@bluewombat/persist-sqlite": "^0.9.0"
|
|
66
65
|
}
|
|
67
66
|
}
|