UNPKG

swarm-pilot

Version:
55 lines (54 loc) 1.82 kB
#!/usr/bin/env node import { Effect, pipe, Schedule, Ref } from "effect"; import { build_runtime } from "./runtime.js"; import { get_args } from "./args.js"; import 'dotenv/config'; import { check_usage_and_scale } from "./actions.js"; import { notify } from "./notify.js"; import { Config } from "./config.js"; import { ServiceInspectState } from "./states.js"; const autoscaler = pipe(Effect.gen(function* () { const config = yield* Config; const state = yield* ServiceInspectState; const schedule = Schedule.spaced(`${config.config.autoscaler_interval} seconds`); const schedule2 = Schedule.spaced(`2 seconds`); const t = yield* Ref.get(state); yield* Effect.all([ Effect.repeat(check_usage_and_scale, schedule), Effect.repeat(Effect.logInfo(t), schedule2), ], { concurrency: 'unbounded', }); }), Effect.catchTags({ AppError: (error) => { return Effect.all([ notify(`‼️ AppError: ${error.message}`), Effect.logError(`AppError: ${error.message} - ${error.cause}`), ]); }, ParseError: (error) => { return Effect.all([ notify(`‼️ ParseError: ${error}`), Effect.logError(`ParseError: ${error.message} - ${error.issue}`), ]); }, ScaleError: (error) => { return Effect.all([ notify(`‼️ ScaleError: ${error}`), Effect.logError(`ScaleError: ${error} - ${error.cause}`), ]); }, })); async function main() { const args = await get_args(); const runtime = build_runtime(args); if (args.s) { runtime.runPromise(autoscaler).catch((error) => { console.error("Error:", error); }); } } main().catch((error) => { console.error("Error:", error); process.exit(1); });