github.com/cloudwego/kitex@v0.9.0/pkg/remote/trans/invoke/message.go (about)

     1  /*
     2   * Copyright 2021 CloudWeGo Authors
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package invoke
    18  
    19  import (
    20  	"errors"
    21  	"net"
    22  	"time"
    23  
    24  	"github.com/cloudwego/netpoll"
    25  
    26  	"github.com/cloudwego/kitex/pkg/remote"
    27  	internal_netpoll "github.com/cloudwego/kitex/pkg/remote/trans/netpoll"
    28  )
    29  
    30  var _ Message = &message{}
    31  
    32  // PayloadHandler is used to operate the payload.
    33  type PayloadHandler interface {
    34  	SetRequestBytes(buf []byte) error
    35  	GetResponseBytes() ([]byte, error)
    36  	GetRequestReaderByteBuffer() remote.ByteBuffer
    37  	GetResponseWriterByteBuffer() remote.ByteBuffer
    38  	Release() error
    39  }
    40  
    41  // Message is the core abstraction.
    42  type Message interface {
    43  	net.Conn
    44  	PayloadHandler
    45  }
    46  
    47  type message struct {
    48  	localAddr  net.Addr
    49  	remoteAddr net.Addr
    50  	request    remote.ByteBuffer
    51  	response   remote.ByteBuffer
    52  }
    53  
    54  // NewMessage creates a new Message using the given net.addr.
    55  func NewMessage(local, remote net.Addr) Message {
    56  	return &message{
    57  		localAddr:  local,
    58  		remoteAddr: remote,
    59  	}
    60  }
    61  
    62  // Read implements the Message interface.
    63  func (f *message) Read(b []byte) (n int, err error) {
    64  	return 0, nil
    65  }
    66  
    67  // Write implements the Message interface.
    68  func (f *message) Write(b []byte) (n int, err error) {
    69  	return 0, nil
    70  }
    71  
    72  // Close implements the Message interface.
    73  func (f *message) Close() error {
    74  	return nil
    75  }
    76  
    77  // LocalAddr implements the Message interface.
    78  func (f *message) LocalAddr() net.Addr {
    79  	return f.localAddr
    80  }
    81  
    82  // RemoteAddr implements the Message interface.
    83  func (f *message) RemoteAddr() net.Addr {
    84  	return f.remoteAddr
    85  }
    86  
    87  // SetDeadline implements the Message interface.
    88  func (f *message) SetDeadline(t time.Time) error {
    89  	return nil
    90  }
    91  
    92  // SetReadDeadline implements the Message interface.
    93  func (f *message) SetReadDeadline(t time.Time) error {
    94  	return nil
    95  }
    96  
    97  // SetWriteDeadline implements the Message interface.
    98  func (f *message) SetWriteDeadline(t time.Time) error {
    99  	return nil
   100  }
   101  
   102  // SetRequestBytes implements the Message interface.
   103  func (f *message) SetRequestBytes(buf []byte) error {
   104  	f.request = remote.NewReaderBuffer(buf)
   105  	return nil
   106  }
   107  
   108  // GetResponseBytes implements the Message interface.
   109  func (f *message) GetResponseBytes() ([]byte, error) {
   110  	if f.response == nil {
   111  		return nil, errors.New("response not init yet")
   112  	}
   113  	return f.response.Peek(f.response.ReadableLen())
   114  }
   115  
   116  // GetRequestReaderByteBuffer implements the Message interface.
   117  func (f *message) GetRequestReaderByteBuffer() remote.ByteBuffer {
   118  	return f.request
   119  }
   120  
   121  // GetResponseWriterByteBuffer implements the Message interface.
   122  func (f *message) GetResponseWriterByteBuffer() remote.ByteBuffer {
   123  	if f.response == nil {
   124  		f.response = internal_netpoll.NewReaderWriterByteBuffer(netpoll.NewLinkBuffer(0))
   125  	}
   126  	return f.response
   127  }
   128  
   129  // Release implements the Message interface.
   130  func (f *message) Release() error {
   131  	if f.request != nil {
   132  		f.request.Release(nil)
   133  	}
   134  	if f.response != nil {
   135  		f.response.Release(nil)
   136  	}
   137  	return nil
   138  }