mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-04-04 14:29:45 +00:00
Refactor/sdk init (#2947)
* fixes for main * refactor package initialization * fixes from testing * more fixes * beta.21 * do not use instanceof * closes #2921 * beta22 * allow disabling kiosk * migration * fix /etc/shadow * actionRequest -> task * beta.23
This commit is contained in:
@@ -5,6 +5,7 @@ import {
|
||||
} from "./input/builder/inputSpec"
|
||||
import * as T from "../types"
|
||||
import { once } from "../util"
|
||||
import { InitScript } from "../inits"
|
||||
|
||||
export type Run<
|
||||
A extends Record<string, any> | InputSpec<Record<string, any>>,
|
||||
@@ -40,10 +41,20 @@ function mapMaybeFn<T, U>(
|
||||
}
|
||||
}
|
||||
|
||||
export class Action<
|
||||
export interface ActionInfo<
|
||||
Id extends T.ActionId,
|
||||
InputSpecType extends Record<string, any> | InputSpec<any>,
|
||||
> {
|
||||
readonly id: Id
|
||||
readonly _INPUT: InputSpecType
|
||||
}
|
||||
|
||||
export class Action<
|
||||
Id extends T.ActionId,
|
||||
InputSpecType extends Record<string, any> | InputSpec<any>,
|
||||
> implements ActionInfo<Id, InputSpecType>
|
||||
{
|
||||
readonly _INPUT: InputSpecType = null as any as InputSpecType
|
||||
private constructor(
|
||||
readonly id: Id,
|
||||
private readonly metadataFn: MaybeFn<T.ActionMetadata>,
|
||||
@@ -111,7 +122,8 @@ export class Action<
|
||||
|
||||
export class Actions<
|
||||
AllActions extends Record<T.ActionId, Action<T.ActionId, any>>,
|
||||
> {
|
||||
> implements InitScript
|
||||
{
|
||||
private constructor(private readonly actions: AllActions) {}
|
||||
static of(): Actions<{}> {
|
||||
return new Actions({})
|
||||
@@ -121,13 +133,26 @@ export class Actions<
|
||||
): Actions<AllActions & { [id in A["id"]]: A }> {
|
||||
return new Actions({ ...this.actions, [action.id]: action })
|
||||
}
|
||||
async update(options: { effects: T.Effects }): Promise<null> {
|
||||
async init(effects: T.Effects): Promise<void> {
|
||||
for (let action of Object.values(this.actions)) {
|
||||
await action.exportMetadata(options)
|
||||
const fn = async () => {
|
||||
let res: (value?: undefined) => void = () => {}
|
||||
const complete = new Promise((resolve) => {
|
||||
res = resolve
|
||||
})
|
||||
const e: T.Effects = effects.child(action.id)
|
||||
e.constRetry = once(() =>
|
||||
complete.then(() => fn()).catch(console.error),
|
||||
)
|
||||
try {
|
||||
await action.exportMetadata({ effects: e })
|
||||
} finally {
|
||||
res()
|
||||
}
|
||||
}
|
||||
await fn()
|
||||
}
|
||||
await options.effects.action.clear({ except: Object.keys(this.actions) })
|
||||
|
||||
return null
|
||||
await effects.action.clear({ except: Object.keys(this.actions) })
|
||||
}
|
||||
get<Id extends T.ActionId>(actionId: Id): AllActions[Id] {
|
||||
return this.actions[actionId]
|
||||
|
||||
Reference in New Issue
Block a user