Kuzzle - 插件间通信(通过方法调用)

Kuzzle - inter-plugins communication (via method calls)

Kuzzle 有没有办法让两个插件相互通信?

假设插件 A 想要在启动时调用插件 B 的方法,甚至在某些用例的运行时。我该怎么做?

目前,无法从另一个插件中检索特定的插件实例。插件管理器在插件初始化时无法访问,但可以通过 Kuzzle 请求以某种方式访问​​(这不是正确的做法)

function (request) {
    const kSymbol = Object.getOwnPropertySymbols(request.context.user)[0];

    request.context.user[kSymbol].pluginsManager.MyPlugin.someMethod(...args);

    ...
}

这个问题背后的想法是在初始化插件时做这样的事情

function init (customConfig, context) {
    const { pluginsManager } = context;

    const result = pluginsManager.MyPlugin.someMethod(...args);

    // make something with the result ?

    // For later use of plugins manager perhaps ?
    this.context = context
}

看起来 Kuzzle Pipes 是正确的做法,因为它们是同步的和可链接的,但是在触发事件时管道 return 什么都不会

function init (customConfig, context) {
    const result = context.accessors.trigger('someEvent', {
        someAttribute: 'someValue'
    });

    console.log(result) // undefined
}

感谢您的帮助!

完全披露:我为 Kuzzle

工作

即使像这样访问 pluginManager 目前可能有效,我们也可能会更改内部实现而不发出警告,因为它没有记录,因此您的插件可能无法在下一版本的 Kuzzle 中工作。

使用另一个插件的功能的最简单方法是通过 custom controller and then call it with the query method of the embedded SDK.

公开一个新的 API 方法

例如,如果您的插件名称在清单中为 notifier-plugin

this.controllers = {
  email: {
    send: request => { /* send email */ }
  }
};

然后你可以在另一个插件中这样调用它:

await this.context.accessors.sdk.query({ 
  controller: 'notifier-plugin/email', 
  action: 'send'
});

请注意,您无法在插件中进行 API 调用 init method

如果您需要在 Kuzzle 启动时进行 API 调用,那么您可以在 core:kuzzleStart 事件上添加一个 hook/pipe。

this.hooks = {
  'core:kuzzleStart': () => this.context.accessors.sdk.query({ 
     controller: 'notifier-plugin/email', 
     action: 'send'
  });
};

最后我注意到您不能像您的示例中那样使用管道 returns,但我提出了一项功能以允许插件开发人员使用管道链 return.

它将在下一版本的 Kuzzle 中提供。