diff --git a/lib/plugin.js b/lib/plugin.js index 81a66330..3e08cd0f 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -334,6 +334,30 @@ function attachPluginMessages(link, pluginInfo, plugin) { } } +/** + * Invokes the given hook on all plugins + * + * @param {Map { link.messages.instanceOutput.send(this, { instance_id: this.config.get("instance.id"), output }) - for (let [name, plugin] of this.plugins) { - plugin.onOutput(output).catch(err => { - console.error(`Plugin ${name} raised error in onOutput:`, err); - }); - } + plugin.invokeHook(this.plugins, "onOutput", output); }); this.server.on("error", err => { @@ -337,9 +333,7 @@ class Instance extends link.Link{ await this.server.disableAchievements() await this.updateInstanceData(); - for (let pluginInstance of this.plugins.values()) { - await pluginInstance.onStart(); - } + await plugin.invokeHook(this.plugins, "onStart"); this._running = true; link.messages.instanceStarted.send(this, { instance_id: this.config.get("instance.id") }); @@ -362,35 +356,26 @@ class Instance extends link.Link{ // XXX this needs more thought to it if (this.server._state === "running") { - for (let pluginInstance of this.plugins.values()) { - await pluginInstance.onStop(); - } - + await plugin.invokeHook(this.plugins, "onStop"); await this.server.stop(); } } async masterConnectionEventEventHandler(message) { - for (let pluginInstance of this.plugins.values()) { - pluginInstance.onMasterConnectionEvent(message.data.event); - } + await plugin.invokeHook(this.plugins, "onMasterConnectionEvent", message.data.event); } async prepareMasterDisconnectRequestHandler() { - for (let pluginInstance of this.plugins.values()) { - await pluginInstance.onPrepareMasterDisconnect(); - } + await plugin.invokeHook(this.plugins, "onPrepareMasterDisconnect"); } async getMetricsRequestHandler() { let results = [] if (this._running) { - for (let pluginInstance of this.plugins.values()) { - let pluginResults = await pluginInstance.onMetrics(); - if (pluginResults !== undefined) { - for await (let result of pluginResults) { - results.push(prometheus.serializeResult(result)) - } + let pluginResults = await plugin.invokeHook(this.plugins, "onMetrics"); + for (let metricIterator of pluginResults) { + for await (let metric of metricIterator) { + results.push(prometheus.serializeResult(metric)) } } } diff --git a/test/lib/plugin.js b/test/lib/plugin.js index 5e915e8a..3e147065 100644 --- a/test/lib/plugin.js +++ b/test/lib/plugin.js @@ -119,4 +119,31 @@ describe("lib/plugin", function() { ); }); }); + + describe("invokeHook()", function() { + let betaTestCalled = false; + let plugins = new Map([ + ["alpha", { + test: async function() { }, + pass: async function(arg) { return arg; }, + error: async function() { throw new Error("Test"); }, + }], + ["beta", { + test: async function() { betaTestCalled = true; }, + pass: async function() { }, + error: async function() { }, + }], + ]); + it("should invoke the hook on the plugin", async function() { + await plugin.invokeHook(plugins, "test"); + assert(betaTestCalled, "Hook was not called"); + }); + it("should pass and return args", async function() { + let result = await plugin.invokeHook(plugins, "pass", 1234); + assert.deepEqual(result, [1234]); + }); + it("should ignore errors", async function() { + await plugin.invokeHook(plugins, "error"); + }); + }); });