github.com/nyan233/littlerpc@v0.4.6-0.20230316182519-0c8d5c48abaf/core/middle/packer/packet.go (about)

     1  package packer
     2  
     3  // Packer 负责解包/拆包的实例要实现的接口
     4  // 获得数据是经过json encode之后的Body,Header不会被发送到此处理
     5  // 默认实现text&gzip
     6  type Packer interface {
     7  	Scheme() string
     8  	// EnPacket 装包
     9  	EnPacket(p []byte) ([]byte, error)
    10  	// UnPacket 拆包
    11  	UnPacket(p []byte) ([]byte, error)
    12  }
    13  
    14  var (
    15  	packerCollection = make(map[string]Packer, 8)
    16  )
    17  
    18  // Text 注意:text类型的压缩器只是提供给client&server
    19  // 的一个提示,client&server的代码应该针对此特殊处理,真实调用会导致panic
    20  type Text struct{}
    21  
    22  func (t Text) Scheme() string {
    23  	return "text"
    24  }
    25  
    26  func (t Text) EnPacket(p []byte) ([]byte, error) {
    27  	panic(interface{}("text packet not able call"))
    28  }
    29  
    30  func (t Text) UnPacket(p []byte) ([]byte, error) {
    31  	panic(interface{}("text packet not able call"))
    32  }
    33  
    34  // Register 该调用是线程安全的
    35  func Register(p Packer) {
    36  	if p == nil {
    37  		panic("encoder is empty")
    38  	}
    39  	if p.Scheme() == "" {
    40  		panic("encoder scheme is empty")
    41  	}
    42  	packerCollection[p.Scheme()] = p
    43  }
    44  
    45  // Get 该调用是线程安全的
    46  func Get(scheme string) Packer {
    47  	return packerCollection[scheme]
    48  }
    49  
    50  func init() {
    51  	Register(new(Text))
    52  	Register(new(Gzip))
    53  }