Skip to content

Межплагинное взаимодействие

Typed RPC

Межплагинные вызовы идут через отдельный RPC runtime path. Плагин явно публикует методы в RPCMethods, а вызывающая сторона использует CallPlugin, CallPluginInto или CallPluginRaw.

Экспорт RPC-метода

go
type ResolveRequest struct {
    ExternalID string `msgpack:"external_id"`
}

type ResolveResponse struct {
    UserID int64 `msgpack:"user_id"`
}

RPCMethods: []wasmplugin.RPCMethod{
    {
        Name:        "resolve_user",
        Description: "Resolve external user ID",
        Handler: func(ctx *wasmplugin.RPCContext) ([]byte, error) {
            var req ResolveRequest
            if err := ctx.Decode(&req); err != nil {
                return nil, err
            }
            return wasmplugin.MarshalRPC(ResolveResponse{UserID: 42})
        },
    },
},

Вызов другого плагина

go
var resp ResolveResponse
err := wasmplugin.CallPluginInto(
    "users-plugin",   // ID целевого плагина
    "resolve_user",   // имя RPC-метода
    ResolveRequest{ExternalID: "ext-123"},
    &resp,
)

Если нужен raw msgpack result:

go
raw, err := wasmplugin.CallPlugin("users-plugin", "resolve_user", ResolveRequest{ExternalID: "ext-123"})

Требование

go
wasmplugin.PluginDep("users-plugin", "Разрешение внешнего ID").Build()

Guardrails

Host проверяет:

  • наличие PluginDep(target, ...)
  • что целевой плагин реально загружен
  • что метод опубликован в RPCMethods
  • защиту от циклов и ограничение глубины вызовов

Публикация событий

Публикация событий, на которые могут подписаться другие плагины через Event-триггеры:

go
err := wasmplugin.PublishEvent("orders.created", map[string]interface{}{
    "order_id": 12345,
    "amount":   99.99,
})

PublishEvent() сериализует payload в JSON. Если payload уже сериализован, используйте PublishEventRawJSON().

Требование

go
wasmplugin.EventsReq("Публикация событий заказов").Build()