mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-11 23:04:52 +09:00
Replace invokeHook and the per plugin on* methods with AsyncHook collections on the controller, host, instance, clusterioctl and web control objects. Plugin entrypoints export a default function that receives a load context and attaches handlers to the hooks it needs. Class exports still load through fromContext with a deprecation warning. The create templates and docs use the entrypoint function. This is clusterio/clusterio#921 recreated on top of master after the ESM migration and the PluginDeclaration permissions change. Closes #730 Co-Authored-By: Cooldude2606 <25043174+Cooldude2606@users.noreply.github.com> Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
51 lines
1.8 KiB
JavaScript
51 lines
1.8 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import * as mock from "../mock.js";
|
|
|
|
import * as host from "@clusterio/host";
|
|
|
|
describe("host/src/BaseHostPlugin", function() {
|
|
describe("class BaseHostPlugin", function() {
|
|
const info = { name: "test" };
|
|
let mockHost;
|
|
beforeEach(function() {
|
|
mockHost = new mock.MockHost();
|
|
});
|
|
|
|
it("should be constructible", async function() {
|
|
const plugin = new host.BaseHostPlugin(info, mockHost, new mock.MockLogger());
|
|
await plugin.init();
|
|
assert.equal(mockHost.hooks.size, 0);
|
|
});
|
|
it("should be constructible from a load context", async function() {
|
|
const logger = new mock.MockLogger();
|
|
const plugin = host.BaseHostPlugin.fromContext({ plugin: info, host: mockHost, logger });
|
|
assert.equal(plugin.info, info);
|
|
assert.equal(plugin.host, mockHost);
|
|
assert.equal(plugin.logger, logger);
|
|
});
|
|
it("should attach overridden hooks", async function() {
|
|
let calls = [];
|
|
class HostPlugin extends host.BaseHostPlugin {
|
|
async onHostConfigFieldChanged(field, curr, prev) { calls.push(["config", field, curr, prev]); }
|
|
async onShutdown() { calls.push(["shutdown", this]); }
|
|
}
|
|
const plugin = new HostPlugin(info, mockHost, new mock.MockLogger());
|
|
assert.deepEqual([...mockHost.hooks.attached], ["test"]);
|
|
assert.equal(mockHost.hooks.metrics.size, 0);
|
|
|
|
await mockHost.hooks.hostConfigFieldChanged.invoke("host.name", "new", "old");
|
|
await mockHost.hooks.shutdown.invoke();
|
|
assert.deepEqual(calls, [["config", "host.name", "new", "old"], ["shutdown", plugin]]);
|
|
});
|
|
it("should detach hooks", async function() {
|
|
class HostPlugin extends host.BaseHostPlugin {
|
|
async onShutdown() { }
|
|
}
|
|
const plugin = new HostPlugin(info, mockHost, new mock.MockLogger());
|
|
assert.equal(mockHost.hooks.size, 1);
|
|
plugin.detachHooks();
|
|
assert.equal(mockHost.hooks.size, 0);
|
|
});
|
|
});
|
|
});
|