diff --git a/packages/lib/package.json b/packages/lib/package.json index 8bc6d749..bbc99d02 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -37,8 +37,10 @@ "devDependencies": { "@types/fs-extra": "^11.0.1", "@types/node": "^20.4.5", + "@types/set-blocking": "^2.0.0", "@types/triple-beam": "^1.3.2", "@types/ws": "^8.5.5", + "@types/yargs": "^17.0.24", "typescript": "^5.1.6" } } diff --git a/packages/lib/src/command.ts b/packages/lib/src/command.ts index d2173ed0..ea5eea11 100644 --- a/packages/lib/src/command.ts +++ b/packages/lib/src/command.ts @@ -9,10 +9,10 @@ import * as libData from "./data"; import * as libErrors from "./errors"; import type { Link } from "./link"; +import type { Argv } from "yargs"; - -export type CommandHandler = (args: Record, control: Link) => Promise; -export type CommandDefinition = [string | string[], string?, Function?]; +export type CommandHandler = (args: any, control: any) => Promise; +export type CommandDefinition = [string | string[], string?, ((yargs: Argv) => void)?]; /** * Represents a command that can be runned by clusterioctl @@ -80,7 +80,7 @@ export class CommandTree { * @param cmd.description - * Descripton to provide for this command tree node. */ - constructor({ name, alias, description }: { name: string, alias: string[], description: string }) { + constructor({ name, alias, description }: { name: string, alias?: string[], description: string }) { if (typeof name !== "string") { throw new Error("name must be a string"); } diff --git a/packages/lib/src/config/definitions.ts b/packages/lib/src/config/definitions.ts index 2d25e542..13e18599 100644 --- a/packages/lib/src/config/definitions.ts +++ b/packages/lib/src/config/definitions.ts @@ -7,7 +7,7 @@ import type { PluginInfo } from "../plugin"; * Controller config group for {@link ControllerConfig} * @extends classes.ConfigGroup */ -class ControllerGroup extends classes.ConfigGroup { } +export class ControllerGroup extends classes.ConfigGroup { } ControllerGroup.defaultAccess = ["controller", "host", "control"]; ControllerGroup.groupName = "controller"; ControllerGroup.define({ @@ -140,7 +140,7 @@ ControllerGroup.finalize(); * Controller Config class * @extends classes.Config */ -class ControllerConfig extends classes.Config { } +export class ControllerConfig extends classes.Config { } ControllerConfig.registerGroup(ControllerGroup); @@ -148,7 +148,7 @@ ControllerConfig.registerGroup(ControllerGroup); * Host config group for {@link HostConfig} * @extends classes.ConfigGroup */ -class HostGroup extends classes.ConfigGroup {} +export class HostGroup extends classes.ConfigGroup {} HostGroup.defaultAccess = ["controller", "host", "control"]; HostGroup.groupName = "host"; HostGroup.define({ @@ -230,7 +230,7 @@ HostGroup.finalize(); * Host Config class * @extends classes.Config */ -class HostConfig extends classes.Config { } +export class HostConfig extends classes.Config { } HostConfig.registerGroup(HostGroup); @@ -238,7 +238,7 @@ HostConfig.registerGroup(HostGroup); * Instance config group for {@link classes.InstanceConfig} * @extends classes.ConfigGroup */ -class InstanceGroup extends classes.ConfigGroup { } +export class InstanceGroup extends classes.ConfigGroup { } InstanceGroup.defaultAccess = ["controller", "host", "control"]; InstanceGroup.groupName = "instance"; InstanceGroup.define({ @@ -269,7 +269,7 @@ InstanceGroup.finalize(); * Factorio config group for {@link classes.InstanceConfig} * @extends classes.ConfigGroup */ -class FactorioGroup extends classes.ConfigGroup { } +export class FactorioGroup extends classes.ConfigGroup { } FactorioGroup.defaultAccess = ["controller", "host", "control"]; FactorioGroup.groupName = "factorio"; FactorioGroup.define({ @@ -393,7 +393,7 @@ FactorioGroup.finalize(); * Instance config class * @extends classes.Config */ -class InstanceConfig extends classes.Config { } +export class InstanceConfig extends classes.Config { } InstanceConfig.registerGroup(InstanceGroup); InstanceConfig.registerGroup(FactorioGroup); @@ -402,7 +402,7 @@ InstanceConfig.registerGroup(FactorioGroup); * Control config group for {@link classes.ControlConfig} * @extends classes.ConfigGroup */ -class ControlGroup extends classes.ConfigGroup {} +export class ControlGroup extends classes.ConfigGroup {} ControlGroup.defaultAccess = ["control"]; ControlGroup.groupName = "control"; ControlGroup.define({ @@ -436,7 +436,7 @@ ControlGroup.finalize(); * Control config class * @extends classes.Config */ -class ControlConfig extends classes.Config { } +export class ControlConfig extends classes.Config { } ControlConfig.registerGroup(ControlGroup); @@ -459,7 +459,7 @@ function validateGroup(pluginInfo: PluginInfo, groupName: string) { * * @param {Array} pluginInfos - Array of plugin info objects. */ -function registerPluginConfigGroups(pluginInfos: PluginInfo[]) { +export function registerPluginConfigGroups(pluginInfos: PluginInfo[]) { for (let pluginInfo of pluginInfos) { if (pluginInfo.ControllerConfigGroup) { validateGroup(pluginInfo, "ControllerConfigGroup"); @@ -492,25 +492,9 @@ function registerPluginConfigGroups(pluginInfos: PluginInfo[]) { /** * Lock configs from adding more groups and make them usable */ -function finalizeConfigs() { +export function finalizeConfigs() { ControllerConfig.finalize(); HostConfig.finalize(); InstanceConfig.finalize(); ControlConfig.finalize(); } - -module.exports = { - ControllerGroup, - HostGroup, - InstanceGroup, - FactorioGroup, - ControlGroup, - - ControllerConfig, - HostConfig, - InstanceConfig, - ControlConfig, - - registerPluginConfigGroups, - finalizeConfigs, -}; diff --git a/packages/lib/src/data/messages_mod.ts b/packages/lib/src/data/messages_mod.ts index 0fadcfda..0c4fe7ce 100644 --- a/packages/lib/src/data/messages_mod.ts +++ b/packages/lib/src/data/messages_mod.ts @@ -193,7 +193,7 @@ export class ModSearchRequest { public queryIssues: string[], public pageCount: number, public resultCount: number, - public results: object[], + public results: { name: string, versions: ModInfo[] }[], ) { } static jsonSchema = Type.Object({ diff --git a/packages/lib/src/link/connectors.ts b/packages/lib/src/link/connectors.ts index b52d2103..203f9c48 100644 --- a/packages/lib/src/link/connectors.ts +++ b/packages/lib/src/link/connectors.ts @@ -340,7 +340,7 @@ export abstract class WebSocketClientConnector extends WebSocketBaseConnector { constructor( protected _url: string, maxReconnectDelay: number, - protected _tlsCa = null + protected _tlsCa: string | undefined, ) { super(undefined as any, new libData.Address(libData.Address.controller, 0)); this._backoff = new ExponentialBackoff({ max: maxReconnectDelay }); diff --git a/packages/lib/src/link/link.ts b/packages/lib/src/link/link.ts index e4352b3a..2736e79c 100644 --- a/packages/lib/src/link/link.ts +++ b/packages/lib/src/link/link.ts @@ -67,8 +67,8 @@ interface EventEntry { allowedDstTypes: Set; eventFromJSON: (json: any) => Event; } -type RequestHandler = (request: Request, src: libData.Address, dst: libData.Address) => any; -type EventHandler = (event: Event, src: libData.Address, dst: libData.Address) => any; +type RequestHandler = (request: Req, src: libData.Address, dst: libData.Address) => Promise; +type EventHandler = (event: T, src: libData.Address, dst: libData.Address) => Promise; interface Router { forwardMessage(origin: Link, message: Message, fallback: boolean): boolean, @@ -99,7 +99,7 @@ export class Link { constructor( public connector: BaseConnector ) { - this.handle(libData.PingRequest, () => {}); + this.handle(libData.PingRequest, async () => {}); // Process messages received by the connector connector.on("message", payload => { diff --git a/packages/lib/src/plugin_loader.ts b/packages/lib/src/plugin_loader.ts index e557bea9..6c44f897 100644 --- a/packages/lib/src/plugin_loader.ts +++ b/packages/lib/src/plugin_loader.ts @@ -84,7 +84,7 @@ function loadPluginClass( */ export async function loadControllerPluginClass( pluginInfo: libPlugin.PluginInfo -): Promise { +): Promise { return loadPluginClass("controllerEntrypoint", "ControllerPlugin", libPlugin.BaseControllerPlugin, pluginInfo); } @@ -98,7 +98,7 @@ export async function loadControllerPluginClass( */ export async function loadInstancePluginClass( pluginInfo: libPlugin.PluginInfo -): Promise { +): Promise { return loadPluginClass("instanceEntrypoint", "InstancePlugin", libPlugin.BaseInstancePlugin, pluginInfo); } @@ -112,6 +112,6 @@ export async function loadInstancePluginClass( */ export async function loadControlPluginClass( pluginInfo: libPlugin.PluginInfo -): Promise { +): Promise { return loadPluginClass("controlEntrypoint", "ControlPlugin", libPlugin.BaseControlPlugin, pluginInfo); }