| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | 
							- package mux
 
- import (
 
- 	"v2ray.com/core/common/buf"
 
- 	"v2ray.com/core/common/net"
 
- 	"v2ray.com/core/common/serial"
 
- )
 
- type Writer struct {
 
- 	id       uint16
 
- 	dest     net.Destination
 
- 	writer   buf.Writer
 
- 	followup bool
 
- }
 
- func NewWriter(id uint16, dest net.Destination, writer buf.Writer) *Writer {
 
- 	return &Writer{
 
- 		id:     id,
 
- 		dest:   dest,
 
- 		writer: writer,
 
- 	}
 
- }
 
- func (w *Writer) writeInternal(b *buf.Buffer) error {
 
- 	meta := FrameMetadata{
 
- 		SessionID: w.id,
 
- 		Target:    w.dest,
 
- 	}
 
- 	if w.followup {
 
- 		meta.SessionStatus = SessionStatusKeep
 
- 	} else {
 
- 		w.followup = true
 
- 		meta.SessionStatus = SessionStatusNew
 
- 	}
 
- 	if b.Len() > 0 {
 
- 		meta.Option.Add(OptionData)
 
- 	}
 
- 	frame := buf.New()
 
- 	frame.AppendSupplier(meta.AsSupplier())
 
- 	if b.Len() > 0 {
 
- 		frame.AppendSupplier(serial.WriteUint16(0))
 
- 		lengthBytes := frame.BytesFrom(-2)
 
- 		nBytes, err := frame.Write(b.Bytes())
 
- 		if err != nil {
 
- 			frame.Release()
 
- 			return err
 
- 		}
 
- 		serial.Uint16ToBytes(uint16(nBytes), lengthBytes[:0])
 
- 		b.SliceFrom(nBytes)
 
- 	}
 
- 	return w.writer.Write(frame)
 
- }
 
- func (w *Writer) Write(b *buf.Buffer) error {
 
- 	defer b.Release()
 
- 	if err := w.writeInternal(b); err != nil {
 
- 		return err
 
- 	}
 
- 	for !b.IsEmpty() {
 
- 		if err := w.writeInternal(b); err != nil {
 
- 			return err
 
- 		}
 
- 	}
 
- 	return nil
 
- }
 
- func (w *Writer) Close() {
 
- 	meta := FrameMetadata{
 
- 		SessionID:     w.id,
 
- 		Target:        w.dest,
 
- 		SessionStatus: SessionStatusEnd,
 
- 	}
 
- 	frame := buf.New()
 
- 	frame.AppendSupplier(meta.AsSupplier())
 
- 	w.writer.Write(frame)
 
- }
 
 
  |