runtime.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package pluginv1
  2. import (
  3. "context"
  4. hcplugin "github.com/hashicorp/go-plugin"
  5. "google.golang.org/grpc"
  6. )
  7. const (
  8. // ProtocolVersion 是宿主与插件进程握手协议版本。
  9. ProtocolVersion = 1
  10. // TransportAPIVersion 是 OpenAI OAuth 出站传输契约版本。
  11. TransportAPIVersion = 1
  12. // UIBridgeVersion 是插件管理页与沙箱 UI 的消息协议版本。
  13. UIBridgeVersion = 1
  14. // TransportPluginName 是 go-plugin 中注册的唯一能力名称。
  15. TransportPluginName = "oauth_transport"
  16. )
  17. // HandshakeConfig 防止普通可执行文件被误当成 Sub2API 插件启动。
  18. var HandshakeConfig = hcplugin.HandshakeConfig{
  19. ProtocolVersion: ProtocolVersion,
  20. MagicCookieKey: "SUB2API_PLUGIN_MAGIC_COOKIE",
  21. MagicCookieValue: "sub2api-plugin-v1",
  22. }
  23. // GRPCPlugin 把生成的 gRPC 服务注册到 go-plugin 子进程。
  24. type GRPCPlugin struct {
  25. hcplugin.NetRPCUnsupportedPlugin
  26. Impl TransportPluginServer
  27. }
  28. func (p *GRPCPlugin) GRPCServer(_ *hcplugin.GRPCBroker, server *grpc.Server) error {
  29. RegisterTransportPluginServer(server, p.Impl)
  30. return nil
  31. }
  32. func (p *GRPCPlugin) GRPCClient(_ context.Context, _ *hcplugin.GRPCBroker, conn *grpc.ClientConn) (any, error) {
  33. return NewTransportPluginClient(conn), nil
  34. }
  35. // ClientPluginMap 返回宿主侧使用的插件声明。
  36. func ClientPluginMap() map[string]hcplugin.Plugin {
  37. return map[string]hcplugin.Plugin{
  38. TransportPluginName: &GRPCPlugin{},
  39. }
  40. }
  41. // Serve 启动一个实现了传输协议的插件进程。
  42. func Serve(impl TransportPluginServer) {
  43. hcplugin.Serve(&hcplugin.ServeConfig{
  44. HandshakeConfig: HandshakeConfig,
  45. Plugins: map[string]hcplugin.Plugin{
  46. TransportPluginName: &GRPCPlugin{Impl: impl},
  47. },
  48. GRPCServer: hcplugin.DefaultGRPCServer,
  49. })
  50. }