handler_cache.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package registry
  2. import (
  3. "errors"
  4. "github.com/v2ray/v2ray-core/app"
  5. "github.com/v2ray/v2ray-core/proxy"
  6. "github.com/v2ray/v2ray-core/transport/internet"
  7. )
  8. var (
  9. inboundFactories = make(map[string]InboundHandlerFactory)
  10. outboundFactories = make(map[string]OutboundHandlerFactory)
  11. ErrProxyNotFound = errors.New("Proxy not found.")
  12. ErrNameExists = errors.New("Proxy with the same name already exists.")
  13. )
  14. func RegisterInboundHandlerCreator(name string, creator InboundHandlerFactory) error {
  15. if _, found := inboundFactories[name]; found {
  16. return ErrNameExists
  17. }
  18. inboundFactories[name] = creator
  19. return nil
  20. }
  21. func MustRegisterInboundHandlerCreator(name string, creator InboundHandlerFactory) {
  22. if err := RegisterInboundHandlerCreator(name, creator); err != nil {
  23. panic(err)
  24. }
  25. }
  26. func RegisterOutboundHandlerCreator(name string, creator OutboundHandlerFactory) error {
  27. if _, found := outboundFactories[name]; found {
  28. return ErrNameExists
  29. }
  30. outboundFactories[name] = creator
  31. return nil
  32. }
  33. func MustRegisterOutboundHandlerCreator(name string, creator OutboundHandlerFactory) {
  34. if err := RegisterOutboundHandlerCreator(name, creator); err != nil {
  35. panic(err)
  36. }
  37. }
  38. func CreateInboundHandler(name string, space app.Space, rawConfig []byte, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) {
  39. creator, found := inboundFactories[name]
  40. if !found {
  41. return nil, ErrProxyNotFound
  42. }
  43. if meta.StreamSettings == nil {
  44. meta.StreamSettings = &internet.StreamSettings{
  45. Type: creator.StreamCapability(),
  46. }
  47. } else {
  48. meta.StreamSettings.Type &= creator.StreamCapability()
  49. }
  50. if len(rawConfig) > 0 {
  51. proxyConfig, err := CreateInboundConfig(name, rawConfig)
  52. if err != nil {
  53. return nil, err
  54. }
  55. return creator.Create(space, proxyConfig, meta)
  56. }
  57. return creator.Create(space, nil, meta)
  58. }
  59. func CreateOutboundHandler(name string, space app.Space, rawConfig []byte, meta *proxy.OutboundHandlerMeta) (proxy.OutboundHandler, error) {
  60. creator, found := outboundFactories[name]
  61. if !found {
  62. return nil, ErrProxyNotFound
  63. }
  64. if meta.StreamSettings == nil {
  65. meta.StreamSettings = &internet.StreamSettings{
  66. Type: creator.StreamCapability(),
  67. }
  68. } else {
  69. meta.StreamSettings.Type &= creator.StreamCapability()
  70. }
  71. if len(rawConfig) > 0 {
  72. proxyConfig, err := CreateOutboundConfig(name, rawConfig)
  73. if err != nil {
  74. return nil, err
  75. }
  76. return creator.Create(space, proxyConfig, meta)
  77. }
  78. return creator.Create(space, nil, meta)
  79. }