diff --git a/lib/actions/setupActions.ts b/lib/actions/setupActions.ts index d31b665..cd198af 100644 --- a/lib/actions/setupActions.ts +++ b/lib/actions/setupActions.ts @@ -8,13 +8,9 @@ export function setupActions(...createdActions: CreatedAction[]) { actions[action.metaData.id] = action.exportedAction; } - const initializeActions = async (effects: Effects) => { - for (const action of createdActions) { - action.exportAction(effects); - } - }; + const actionsMetadata = createdActions.map((x) => x.metaData); return { actions, - initializeActions, + actionsMetadata, }; } diff --git a/lib/autoconfig/AutoConfig.ts b/lib/autoconfig/AutoConfig.ts index 70eff94..465feb5 100644 --- a/lib/autoconfig/AutoConfig.ts +++ b/lib/autoconfig/AutoConfig.ts @@ -1,18 +1,18 @@ -import { AutoConfigure, Effects, ExpectedExports } from "../types"; +import { AutoConfigure, DeepPartial, Effects, ExpectedExports } from "../types"; import { Utils, deepEqual, deepMerge, utils } from "../util"; -export type AutoConfigFrom = { - [key: string]: (options: { +export type AutoConfigFrom = { + [key in keyof NestedConfigs & string]: (options: { effects: Effects; localConfig: Input; - remoteConfig: unknown; + remoteConfig: NestedConfigs[key]; utils: Utils; - }) => Promise>; + }) => Promise>; }; -export class AutoConfig { +export class AutoConfig { constructor( - readonly configs: AutoConfigFrom, - readonly path: keyof AutoConfigFrom, + readonly configs: AutoConfigFrom, + readonly path: keyof AutoConfigFrom, ) {} async check( @@ -23,6 +23,7 @@ export class AutoConfig { ...options, utils: utils(options.effects), localConfig: options.localConfig as Input, + remoteConfig: options.remoteConfig as any, }; if ( !deepEqual( @@ -43,6 +44,7 @@ export class AutoConfig { ...options, utils: utils(options.effects), localConfig: options.localConfig as Input, + remoteConfig: options.remoteConfig as any, }; return deepMerge( {}, diff --git a/lib/autoconfig/setupAutoConfig.ts b/lib/autoconfig/setupAutoConfig.ts index 9b0e1c4..ade5059 100644 --- a/lib/autoconfig/setupAutoConfig.ts +++ b/lib/autoconfig/setupAutoConfig.ts @@ -1,12 +1,24 @@ +import { GenericManifest } from "../manifest/ManifestTypes"; import { AutoConfig, AutoConfigFrom } from "./AutoConfig"; -export function setupAutoConfig(configs: AutoConfigFrom) { +export function setupAutoConfig< + WD, + Input, + Manifest extends GenericManifest, + NestedConfigs extends { + [key in keyof Manifest["dependencies"]]: unknown; + }, +>(configs: AutoConfigFrom) { type C = typeof configs; const answer = { ...configs } as unknown as { - [k in keyof C]: AutoConfig; + [k in keyof C]: AutoConfig; }; for (const key in configs) { - answer[key] = new AutoConfig(configs, key); + answer[key as keyof typeof configs] = new AutoConfig< + WD, + Input, + NestedConfigs + >(configs, key as keyof typeof configs); } return answer; } diff --git a/lib/health/HealthCheck.ts b/lib/health/HealthCheck.ts index 6540798..53578eb 100644 --- a/lib/health/HealthCheck.ts +++ b/lib/health/HealthCheck.ts @@ -1,55 +1,43 @@ -// import { InterfaceReceipt } from "../mainFn/interfaceReceipt"; -// import { Daemon, Effects } from "../types"; -// import { CheckResult } from "./checkFns/CheckResult"; -// import { ReadyReceipt } from "./ReadyProof"; -// import { HealthReceipt } from "./HealthReceipt"; -// import { Trigger } from "./trigger"; -// import { TriggerInput } from "./trigger/TriggerInput"; -// import { defaultTrigger } from "./trigger/defaultTrigger"; +import { InterfaceReceipt } from "../mainFn/interfaceReceipt"; +import { Daemon, Effects } from "../types"; +import { CheckResult } from "./checkFns/CheckResult"; +import { HealthReceipt } from "./HealthReceipt"; +import { Trigger } from "./trigger"; +import { TriggerInput } from "./trigger/TriggerInput"; +import { defaultTrigger } from "./trigger/defaultTrigger"; -// function readReciptOf(a: A) { -// return a as A & ReadyReceipt; -// } -// export function readyCheck(o: { -// effects: Effects; -// started(onTerm: () => void): null; -// interfaceReceipt: InterfaceReceipt; -// healthReceipts: Iterable; -// daemonReceipt: Daemon; -// name: string; -// trigger?: Trigger; -// fn(): Promise | CheckResult; -// onFirstSuccess?: () => () => Promise | unknown; -// }) { -// new Promise(async () => { -// const trigger = (o.trigger ?? defaultTrigger)(); -// let currentValue: TriggerInput = { -// lastResult: null, -// hadSuccess: false, -// }; -// for ( -// let res = await trigger.next(currentValue); -// !res.done; -// res = await trigger.next(currentValue) -// ) { -// try { -// const { status, message } = await o.fn(); -// if (!currentValue.hadSuccess) { -// await o.started(o?.onFirstSuccess ?? (() => o.daemonReceipt.term())); -// } -// await o.effects.setHealth({ -// name: o.name, -// status, -// message, -// }); -// currentValue.hadSuccess = true; -// currentValue.lastResult = "success"; -// } catch (_) { -// currentValue.lastResult = "failure"; -// } -// } -// }); -// return readReciptOf({ -// daemon: o.daemonReceipt, -// }); -// } +export function healthCheck(o: { + effects: Effects; + name: string; + trigger?: Trigger; + fn(): Promise | CheckResult; + onFirstSuccess?: () => () => Promise | unknown; +}) { + new Promise(async () => { + let currentValue: TriggerInput = { + lastResult: null, + hadSuccess: false, + }; + const getCurrentValue = () => currentValue; + const trigger = (o.trigger ?? defaultTrigger)(getCurrentValue); + for ( + let res = await trigger.next(); + !res.done; + res = await trigger.next() + ) { + try { + const { status, message } = await o.fn(); + await o.effects.setHealth({ + name: o.name, + status, + message, + }); + currentValue.hadSuccess = true; + currentValue.lastResult = "success"; + } catch (_) { + currentValue.lastResult = "failure"; + } + } + }); + return {} as HealthReceipt; +} diff --git a/lib/health/trigger/changeOnFirstSuccess.ts b/lib/health/trigger/changeOnFirstSuccess.ts index b8ec1a7..aa0c151 100644 --- a/lib/health/trigger/changeOnFirstSuccess.ts +++ b/lib/health/trigger/changeOnFirstSuccess.ts @@ -4,25 +4,28 @@ import { Trigger } from "./index"; export function changeOnFirstSuccess(o: { beforeFirstSuccess: Trigger; afterFirstSuccess: Trigger; -}) { - return async function* () { - const beforeFirstSuccess = o.beforeFirstSuccess(); - let currentValue: TriggerInput = yield; - beforeFirstSuccess.next(currentValue); +}): Trigger { + return async function* (getInput) { + const beforeFirstSuccess = o.beforeFirstSuccess(getInput); + yield; + let currentValue = getInput(); + beforeFirstSuccess.next(); for ( - let res = await beforeFirstSuccess.next(currentValue); + let res = await beforeFirstSuccess.next(); currentValue?.lastResult !== "success" && !res.done; - res = await beforeFirstSuccess.next(currentValue) + res = await beforeFirstSuccess.next() ) { - currentValue = yield; + yield; + currentValue = getInput(); } - const afterFirstSuccess = o.afterFirstSuccess(); + const afterFirstSuccess = o.afterFirstSuccess(getInput); for ( - let res = await afterFirstSuccess.next(currentValue); + let res = await afterFirstSuccess.next(); !res.done; - res = await afterFirstSuccess.next(currentValue) + res = await afterFirstSuccess.next() ) { - currentValue = yield; + yield; + currentValue = getInput(); } }; } diff --git a/lib/health/trigger/index.ts b/lib/health/trigger/index.ts index 6d4ec88..91f6982 100644 --- a/lib/health/trigger/index.ts +++ b/lib/health/trigger/index.ts @@ -2,4 +2,6 @@ import { TriggerInput } from "./TriggerInput"; export { changeOnFirstSuccess } from "./changeOnFirstSuccess"; export { cooldownTrigger } from "./cooldownTrigger"; -export type Trigger = () => AsyncIterator; +export type Trigger = ( + getInput: () => TriggerInput, +) => AsyncIterator; diff --git a/lib/mainFn/Daemons.ts b/lib/mainFn/Daemons.ts index 540dc0c..d3141a7 100644 --- a/lib/mainFn/Daemons.ts +++ b/lib/mainFn/Daemons.ts @@ -82,11 +82,15 @@ export class Daemons { const { command } = daemon; const child = effects.runDaemon(command); - const trigger = (daemon.ready.trigger ?? defaultTrigger)(); + let currentInput = {}; + const getCurrentInput = () => currentInput; + const trigger = (daemon.ready.trigger ?? defaultTrigger)( + getCurrentInput, + ); for ( - let res = await trigger.next({}); + let res = await trigger.next(); !res.done; - res = await trigger.next({}) + res = await trigger.next() ) { const response = await daemon.ready.fn(); if (response.status === "passing") { diff --git a/lib/manifest/setupManifest.ts b/lib/manifest/setupManifest.ts index d5d7199..10e7291 100644 --- a/lib/manifest/setupManifest.ts +++ b/lib/manifest/setupManifest.ts @@ -1,9 +1,15 @@ import { GenericManifest, ManifestVersion } from "./ManifestTypes"; export function setupManifest< - M extends GenericManifest & { id: Id; version: Version }, Id extends string, Version extends ManifestVersion, ->(manifest: M): M { + Dependencies extends Record, +>( + manifest: GenericManifest & { + dependencies: Dependencies; + id: Id; + version: Version; + }, +): GenericManifest & { dependencies: Dependencies; id: Id; version: Version } { return manifest; } diff --git a/lib/migrations/setupMigrations.ts b/lib/migrations/setupMigrations.ts index 89d2cfa..8f4f542 100644 --- a/lib/migrations/setupMigrations.ts +++ b/lib/migrations/setupMigrations.ts @@ -7,7 +7,6 @@ import { Migration } from "./Migration"; export function setupMigrations>>( manifest: GenericManifest, - initializeActions: ReturnType["initializeActions"], ...migrations: EnsureUniqueId ) { const sortedMigrations = once(() => { @@ -19,7 +18,6 @@ export function setupMigrations>>( }); const currentVersion = once(() => EmVer.parse(manifest.version)); const init: ExpectedExports.init = async ({ effects, previousVersion }) => { - await initializeActions(effects); if (!!previousVersion) { const previousVersionEmVer = EmVer.parse(previousVersion); for (const [_, migration] of sortedMigrations() diff --git a/lib/types.ts b/lib/types.ts index 8a00e5b..e277ae8 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -437,7 +437,7 @@ export type MigrationRes = { export type ActionResult = { message: string; - value?: string; + value: null | string; copyable: boolean; qr: boolean; }; diff --git a/package-lock.json b/package-lock.json index 2fdd63f..e5fa97d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "start-sdk", - "version": "0.4.0-lib0.charlie34", + "version": "0.4.0-lib0.charlie36", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "start-sdk", - "version": "0.4.0-lib0.charlie34", + "version": "0.4.0-lib0.charlie36", "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", diff --git a/package.json b/package.json index ed0d21f..7890057 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "start-sdk", - "version": "0.4.0-lib0.charlie34", + "version": "0.4.0-lib0.charlie36", "description": "For making the patterns that are wanted in making services for the startOS.", "main": "./lib/index.js", "types": "./lib/index.d.ts",