handler_cache.go 2.4 KB

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