Merge pull request #483 from bbassie/refactor/init-function-exports

Export init functions instead of plugin classes
This commit is contained in:
Cooldude2606 authored and GitHub committed 2026-09-27 01:53:11 +01:00
commit 46bb15e4a6
28 files changed
+268 -134

No files matched your search

+17 -2
View File
@@ -1,11 +1,20 @@
import { BaseControllerPlugin } from "@clusterio/controller";
import type { Controller, ControllerPluginContext } from "@clusterio/controller";
import * as lib from "@clusterio/lib";
import * as messages from "./messages.js";
import * as path from "node:path";
export class ControllerPlugin extends BaseControllerPlugin {
export class ControllerPlugin {
controller: Controller;
logger: lib.Logger;
name: string;
reports!: lib.SubscribableDatastore<messages.ReportRecord>;
constructor(context: ControllerPluginContext) {
this.controller = context.controller;
this.logger = context.logger;
this.name = context.plugin.name;
}
async init() {
const databaseDirectory = this.controller.config.get("controller.database_directory");
@@ -23,6 +32,8 @@ export class ControllerPlugin extends BaseControllerPlugin {
this.controller.handle(messages.ReportGetRequest, this.handleReportGetRequest.bind(this));
this.controller.handle(messages.ReportCreateRequest, this.handleReportCreateRequest.bind(this));
this.controller.handle(messages.ReportDeleteRequest, this.handleReportDeleteRequest.bind(this));
this.controller.hooks.shutdown.attach(this.name, this.onShutdown.bind(this));
}
async onShutdown() {
@@ -141,3 +152,7 @@ export class ControllerPlugin extends BaseControllerPlugin {
}
}
}
export default async function (context: ControllerPluginContext) {
await new ControllerPlugin(context).init();
}
+17 -2
View File
@@ -1,4 +1,5 @@
import { BaseInstancePlugin } from "@clusterio/host";
import type { Instance, InstancePluginContext } from "@clusterio/host";
import type * as lib from "@clusterio/lib";
import * as messages from "./messages.js";
/** Sent by the lua side when a player reports another. */
@@ -28,7 +29,17 @@ export type IpcReportDelete = {
* the answer is handed back to lua once it arrives. The instance may have
* stopped by then, in which case the answer is dropped.
*/
export class InstancePlugin extends BaseInstancePlugin {
export class InstancePlugin {
instance: Instance;
logger: lib.Logger;
name: string;
constructor(context: InstancePluginContext) {
this.instance = context.instance;
this.logger = context.logger;
this.name = context.plugin.name;
}
async init() {
this.instance.server.handle("exp_reports:create", this.handleCreateIPC.bind(this));
this.instance.server.handle("exp_reports:list", this.handleListIPC.bind(this));
@@ -93,3 +104,7 @@ export class InstancePlugin extends BaseInstancePlugin {
);
}
}
export default async function (context: InstancePluginContext) {
await new InstancePlugin(context).init();
}
+12 -2
View File
@@ -1,7 +1,7 @@
import t from "tap";
import * as lib from "@clusterio/lib";
import { Controller, InstanceRecord } from "@clusterio/controller";
import { ControllerPlugin } from "../dist/node/controller.js";
import entrypoint, { ControllerPlugin } from "../dist/node/controller.js";
import * as messages from "../dist/node/messages.js";
import { plugin as pluginDeclaration } from "../dist/node/index.js";
@@ -46,13 +46,23 @@ async function startPlugin(t2, { config = {} } = {}) {
broadcast(event);
};
const plugin = new ControllerPlugin({ name: "exp_reports" }, controller, undefined, logger);
const plugin = new ControllerPlugin({ plugin: { name: "exp_reports" }, controller, logger });
plugin.logger = { ...logger, warn: message => state.warnings.push(message) };
plugin.postWebhook = async (url, body) => { state.posts.push({ url, body }); };
await plugin.init();
return { plugin, controller, state };
}
t.test("entrypoint", async t2 => {
const controllerConfig = new lib.ControllerConfig("controller", { "controller.database_directory": t2.testdir() });
const controller = new Controller(logger, [], controllerConfig);
await entrypoint({ controller, logger, plugin: { name: "exp_reports" }, metrics: undefined });
for (const hook of ["shutdown"]) {
t2.ok([...controller.hooks[hook].attached].includes("exp_reports"), `attached to ${hook}`);
}
await controller.hooks.shutdown.invoke();
});
t.test("class ControllerPlugin", t2 => {
t2.test(".handleReportCreateRequest() from an instance records the instance and the reporter", async t3 => {
const { plugin } = await startPlugin(t3);
+3 -1
View File
@@ -10,6 +10,8 @@ for (const Message of pluginDeclaration.messages) {
lib.Link.register(Message);
}
const logger = { child: () => logger, info: () => {}, warn: () => {}, error: () => {}, verbose: () => {} };
class TestConnector extends lib.BaseConnector {
constructor() {
super(lib.Address.fromShorthand({ instanceId: 1 }), lib.Address.fromShorthand({ hostId: 1 }));
@@ -61,7 +63,7 @@ async function startPlugin(t2, { reports = [report(1, "bob", "alice"), report(2,
instance.notifyStatus("running");
state.sent.length = 0;
const plugin = new InstancePlugin({ name: "exp_reports" }, instance, {});
const plugin = new InstancePlugin({ plugin: { name: "exp_reports" }, instance, host: {}, logger });
await plugin.init();
return { plugin, instance, state };
}