putback

package module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 27, 2025 License: CC0-1.0 Imports: 6 Imported by: 1

README

putback

A minimal library with wrappers for common I/O interfaces, adding the ability to return read bytes back to the stream for subsequent reading.

Split example:
asciicast

Minimal hello X example:

package main

import (
	"fmt"
	"io"
	"net"

	"github.com/asciimoth/putback"
)

func main() {
	// echo "WORLD" | nc -c 127.0.0.1 3333
	l, err := net.Listen("tcp4", "127.0.0.1:3333")
	if err != nil {
		panic(err)
	}

	for {
		c, err := l.Accept()
		if err != nil {
			panic(err)
		}

		c = putback.WrapConn(c, []byte("hello "), nil)

		b, _ := io.ReadAll(c)

		fmt.Println(string(b))
	}
}

License

Files in this repository are distributed under the CC0 license.

CC0
To the extent possible under law, ASCIIMoth has waived all copyright and related or neighboring rights to putback.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func WrapConn

func WrapConn(conn net.Conn, bytes []byte, pool BufferPool) net.Conn

Types

type BackBuffer

type BackBuffer struct {
	Bytes   []byte // May be nil
	Pointer int
	Pool    BufferPool // May be nil
}

func (*BackBuffer) BytesLeft

func (b *BackBuffer) BytesLeft() int

func (*BackBuffer) PutBack

func (b *BackBuffer) PutBack(bytes []byte)

func (*BackBuffer) Read

func (b *BackBuffer) Read(p []byte) (n int, err error)

Never returns error

func (*BackBuffer) Wipe

func (b *BackBuffer) Wipe()

type BackPacketBuffer

type BackPacketBuffer[T any] struct {
	Packets []Packet[T] // May be nil
	Pool    BufferPool  // May be nil
}

func (*BackPacketBuffer[T]) PacketsLeft

func (b *BackPacketBuffer[T]) PacketsLeft() int

func (*BackPacketBuffer[T]) PutBack

func (b *BackPacketBuffer[T]) PutBack(bytes []byte, Assoc T)

func (*BackPacketBuffer[T]) ReadFrom

func (b *BackPacketBuffer[T]) ReadFrom(p []byte) (n int, assoc T, err error)

Never returns error

func (*BackPacketBuffer[T]) Wipe

func (b *BackPacketBuffer[T]) Wipe()

type BufferPool

type BufferPool interface {
	// Should return byte buffer with exactly provided length and any capacity
	GetBuffer(length int) []byte
	// Putted buffer may have arbitrary length and capacity
	PutBuffer(buf []byte)
}

type Packet

type Packet[T any] struct {
	Buffer []byte
	Assoc  T
}

type PutBackConn

type PutBackConn struct {
	net.Conn
	Buffer BackBuffer
}

func (*PutBackConn) Close

func (pb *PutBackConn) Close() error

func (*PutBackConn) PutBack

func (pb *PutBackConn) PutBack(bytes []byte)

func (*PutBackConn) Read

func (pb *PutBackConn) Read(p []byte) (n int, err error)

type PutBackPacketConn

type PutBackPacketConn struct {
	net.PacketConn
	Buffer BackPacketBuffer[net.Addr]
}

func (*PutBackPacketConn) Close

func (pb *PutBackPacketConn) Close() error

func (*PutBackPacketConn) PutBack

func (pb *PutBackPacketConn) PutBack(bytes []byte, addr net.Addr)

func (*PutBackPacketConn) ReadFrom

func (pb *PutBackPacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error)

type PutBackReadCloser

type PutBackReadCloser struct {
	io.ReadCloser
	Buffer BackBuffer
}

func (*PutBackReadCloser) Close

func (pb *PutBackReadCloser) Close() error

func (*PutBackReadCloser) PutBack

func (pb *PutBackReadCloser) PutBack(bytes []byte)

func (*PutBackReadCloser) Read

func (pb *PutBackReadCloser) Read(p []byte) (n int, err error)

type PutBackReadWriteCloser

type PutBackReadWriteCloser struct {
	io.ReadWriteCloser
	Buffer BackBuffer
}

func (*PutBackReadWriteCloser) Close

func (pb *PutBackReadWriteCloser) Close() error

func (*PutBackReadWriteCloser) PutBack

func (pb *PutBackReadWriteCloser) PutBack(bytes []byte)

func (*PutBackReadWriteCloser) Read

func (pb *PutBackReadWriteCloser) Read(p []byte) (n int, err error)

type PutBackReadWriter

type PutBackReadWriter struct {
	io.ReadWriter
	Buffer BackBuffer
}

func (*PutBackReadWriter) PutBack

func (pb *PutBackReadWriter) PutBack(bytes []byte)

func (*PutBackReadWriter) Read

func (pb *PutBackReadWriter) Read(p []byte) (n int, err error)

type PutBackReader

type PutBackReader struct {
	io.Reader
	Buffer BackBuffer
}

func (*PutBackReader) PutBack

func (pb *PutBackReader) PutBack(bytes []byte)

func (*PutBackReader) Read

func (pb *PutBackReader) Read(p []byte) (n int, err error)

type PutBackTCPConn

type PutBackTCPConn struct {
	TCPConn
	Buffer BackBuffer
}

func (*PutBackTCPConn) Close

func (pb *PutBackTCPConn) Close() error

func (*PutBackTCPConn) CloseRead

func (pb *PutBackTCPConn) CloseRead() error

func (*PutBackTCPConn) PutBack

func (pb *PutBackTCPConn) PutBack(bytes []byte)

func (*PutBackTCPConn) Read

func (pb *PutBackTCPConn) Read(p []byte) (n int, err error)

func (*PutBackTCPConn) WriteTo

func (pb *PutBackTCPConn) WriteTo(w io.Writer) (int64, error)

type PutBackUDPConn

type PutBackUDPConn struct {
	UDPConn
	Buffer BackPacketBuffer[*net.UDPAddr]
}

func (*PutBackUDPConn) Close

func (pb *PutBackUDPConn) Close() error

func (*PutBackUDPConn) PutBack

func (pb *PutBackUDPConn) PutBack(bytes []byte, addr *net.UDPAddr)

func (*PutBackUDPConn) Read

func (pb *PutBackUDPConn) Read(p []byte) (n int, err error)

func (*PutBackUDPConn) ReadFrom

func (pb *PutBackUDPConn) ReadFrom(p []byte) (n int, addr net.Addr, err error)

func (*PutBackUDPConn) ReadFromUDP

func (pb *PutBackUDPConn) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error)

func (*PutBackUDPConn) ReadFromUDPAddrPort

func (pb *PutBackUDPConn) ReadFromUDPAddrPort(b []byte) (n int, addr netip.AddrPort, err error)

func (*PutBackUDPConn) ReadMsgUDP

func (pb *PutBackUDPConn) ReadMsgUDP(b, oob []byte) (n, oobn, flags int, addr *net.UDPAddr, err error)

func (*PutBackUDPConn) ReadMsgUDPAddrPort

func (pb *PutBackUDPConn) ReadMsgUDPAddrPort(b, oob []byte) (n, oobn, flags int, addr netip.AddrPort, err error)

type TCPConn

type TCPConn interface {
	net.Conn
	ReadFrom(r io.Reader) (int64, error)
	CloseRead() error
	CloseWrite() error
	File() (f *os.File, err error)
	MultipathTCP() (bool, error)
	SetKeepAlive(keepalive bool) error
	SetKeepAliveConfig(config net.KeepAliveConfig) error
	SetKeepAlivePeriod(d time.Duration) error
	SetLinger(sec int) error
	SetNoDelay(noDelay bool) error
	SetReadBuffer(bytes int) error
	SetWriteBuffer(bytes int) error
	SyscallConn() (syscall.RawConn, error)
	WriteTo(w io.Writer) (int64, error)
}

type UDPConn

type UDPConn interface {
	net.PacketConn
	net.Conn
	File() (f *os.File, err error)
	ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error)
	ReadFromUDPAddrPort(b []byte) (n int, addr netip.AddrPort, err error)
	ReadMsgUDP(b, oob []byte) (n, oobn, flags int, addr *net.UDPAddr, err error)
	ReadMsgUDPAddrPort(b, oob []byte) (n, oobn, flags int, addr netip.AddrPort, err error)
	RemoteAddr() net.Addr
	SetWriteBuffer(bytes int) error
	SyscallConn() (syscall.RawConn, error)
	WriteMsgUDP(b, oob []byte, addr *net.UDPAddr) (n, oobn int, err error)
	WriteMsgUDPAddrPort(b, oob []byte, addr netip.AddrPort) (n, oobn int, err error)
	WriteToUDP(b []byte, addr *net.UDPAddr) (int, error)
	WriteToUDPAddrPort(b []byte, addr netip.AddrPort) (int, error)
}

Directories

Path Synopsis
examples
hello command
split command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL