plugin.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. package sip003
  2. import (
  3. "context"
  4. "net"
  5. "github.com/sagernet/sing-box/adapter"
  6. E "github.com/sagernet/sing/common/exceptions"
  7. M "github.com/sagernet/sing/common/metadata"
  8. N "github.com/sagernet/sing/common/network"
  9. )
  10. type PluginConstructor func(ctx context.Context, pluginArgs Args, router adapter.Router, dialer N.Dialer, serverAddr M.Socksaddr) (Plugin, error)
  11. type Plugin interface {
  12. DialContext(ctx context.Context) (net.Conn, error)
  13. }
  14. var plugins map[string]PluginConstructor
  15. func RegisterPlugin(name string, constructor PluginConstructor) {
  16. if plugins == nil {
  17. plugins = make(map[string]PluginConstructor)
  18. }
  19. plugins[name] = constructor
  20. }
  21. func CreatePlugin(ctx context.Context, name string, pluginArgs string, router adapter.Router, dialer N.Dialer, serverAddr M.Socksaddr) (Plugin, error) {
  22. pluginOptions, err := ParsePluginOptions(pluginArgs)
  23. if err != nil {
  24. return nil, E.Cause(err, "parse plugin_opts")
  25. }
  26. constructor, loaded := plugins[name]
  27. if !loaded {
  28. return nil, E.New("plugin not found: ", name)
  29. }
  30. return constructor(ctx, pluginOptions, router, dialer, serverAddr)
  31. }