mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-26 02:11:53 +00:00
* fix: race condition in Daemon.stop() * fix: do not stop Daemon on context leave * fix: remove duplicate Daemons.term calls * feat: honor dependency order when shutting terminating Daemons * fixes, and remove started --------- Co-authored-by: Aiden McClelland <me@drbonez.dev>
35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
import * as T from "../../../base/lib/types"
|
|
import { SubContainer, SubContainerOwned } from "../util/SubContainer"
|
|
import { CommandController } from "./CommandController"
|
|
import { Daemon } from "./Daemon"
|
|
import { DaemonCommandType } from "./Daemons"
|
|
|
|
/**
|
|
* This is a wrapper around CommandController that has a state of off, where the command shouldn't be running
|
|
* and the others state of running, where it will keep a living running command
|
|
* unlike Daemon, does not restart on success
|
|
*/
|
|
|
|
export class Oneshot<
|
|
Manifest extends T.SDKManifest,
|
|
C extends SubContainer<Manifest> | null = SubContainer<Manifest> | null,
|
|
> extends Daemon<Manifest, C> {
|
|
static of<Manifest extends T.SDKManifest>() {
|
|
return <C extends SubContainer<Manifest> | null>(
|
|
effects: T.Effects,
|
|
subcontainer: C,
|
|
exec: DaemonCommandType<Manifest, C>,
|
|
) => {
|
|
let subc: SubContainer<Manifest> | null = subcontainer
|
|
if (subcontainer && subcontainer.isOwned()) subc = subcontainer.rc()
|
|
const startCommand = () =>
|
|
CommandController.of<Manifest, C>()(
|
|
effects,
|
|
(subc?.rc() ?? null) as C,
|
|
exec,
|
|
)
|
|
return new Oneshot<Manifest, C>(subcontainer, startCommand, true)
|
|
}
|
|
}
|
|
}
|