msg

package
v0.2.8 Latest Latest
Warning

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

Go to latest
Published: Jan 19, 2024 License: GPL-3.0 Imports: 6 Imported by: 6

Documentation

Overview

Package msg defines the io variants of the github.com/blitz-frost/msg interfaces, as well as several implementation utilities.

See the Packet type family for a quick way to adapt io, stream based functionality to a discrete message based one.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ConnAsyncOf added in v0.2.8

func ConnAsyncOf(c Conn) (msg.ConnBlock[Reader, Writer], error)

func ConnOf

func ConnOf(mc MultiplexConn, ch byte) msg.ConnBlock[Reader, Writer]

func ExchangeConnOf

func ExchangeConnOf(rExc, wExc Conn) (msg.ConnBlock[ExchangeReader, ExchangeWriter], error)

The connections for the reader and writer side must be distinct.

Types

type Buffer

type Buffer struct {
	// contains filtered or unexported fields
}

A Buffer accumulates writes before forwading them in a single call when closing. The internal buffer will be grown as needed. It is generally more efficient to reuse a Buffer rather than always allocating a new one.

func BufferMake added in v0.2.8

func BufferMake(dst Writer) *Buffer

func (*Buffer) Cancel

func (x *Buffer) Cancel() error

Cancel discards the internal buffer and closes the destination Writer.

func (*Buffer) Close

func (x *Buffer) Close() error

Close flushes the internal buffer and then closes the destination Writer.

func (*Buffer) Write

func (x *Buffer) Write(b []byte) (int, error)

Never returns an error.

func (*Buffer) WriterTake

func (x *Buffer) WriterTake(dst Writer) error

WriterTake sets the Buffer to write to a new destination. It does not reset the internal buffer, nor close the old destination. Never returns an error.

type BufferGiver

type BufferGiver struct {
	// contains filtered or unexported fields
}

A BufferGiver wraps a WriterGiver to give a Buffer instead. Reuses the same Buffer between calls.

func BufferGiverMake added in v0.2.7

func BufferGiverMake(wg WriterGiver, buf *Buffer) BufferGiver

buf may be nil, in which case a new *Buffer will be allocated.

func (BufferGiver) Writer

func (x BufferGiver) Writer() (Writer, error)

The returned value is a *Buffer. Returns an interface in order to satisfy the WriterGiver interface.

type Conn

type Conn = msg.Conn[Reader, Writer]

type Demultiplexer

type Demultiplexer interface {
	ReaderChain(byte, ReaderTaker) error
}

A Demultiplexer chains incoming messages from particular channels to a respective destination.

func DemultiplexerOf

func DemultiplexerOf(rc ReaderChainer) (Demultiplexer, error)

DemultiplexerOf wraps rc as a simple Demultiplexer implementation. MultiplexerOf should be used on the sending end. The returned value will also be a ReaderTaker.

type ExchangeConn

type ExchangeConn = msg.Conn[ExchangeReader, ExchangeWriter]

type ExchangeReader

type ExchangeReader interface {
	Reader
	WriterGiver
}

type ExchangeReaderChainer

type ExchangeReaderChainer = msg.ReaderChainer[ExchangeReader]

func ExchangeReaderChainerOf

func ExchangeReaderChainerOf(c Conn) (ExchangeReaderChainer, error)

Note that an ExchangeReaderChainer and an ExchangeWriterGiver cannot be formed onto the same Conn simultaneously. Instead, the Conn must first be converted to a MultiplexConn, of which separate channels must be used. The returned value is also a ReaderTaker.

type ExchangeReaderTaker

type ExchangeReaderTaker = msg.ReaderTaker[ExchangeReader]

type ExchangeWriter

type ExchangeWriter interface {
	Writer
	ReaderGiver
}

type ExchangeWriterGiver

type ExchangeWriterGiver = msg.WriterGiver[ExchangeWriter]

func ExchangeWriterGiverOf

func ExchangeWriterGiverOf(c Conn) (ExchangeWriterGiver, error)

Note that an ExchangeReaderChainer and an ExchangeWriterGiver cannot be formed onto the same Conn simultaneously. Instead, the Conn must first be converted to a MultiplexConn, of which separate channels must be used. The returned value is also a ReaderTaker.

type MultiplexConn

type MultiplexConn interface {
	Demultiplexer
	Multiplexer
}

func MultiplexConnOf

func MultiplexConnOf(c Conn) (MultiplexConn, error)

The returned value will also be a ReaderTaker.

type Multiplexer

type Multiplexer interface {
	Writer(byte) (Writer, error)
}

A Multiplexer provides Writers to particular channels of a connection. A single byte is chosen for mapping, as it should be the easiest to implement while providing more than enough channels for most use cases.

func MultiplexerOf

func MultiplexerOf(wg WriterGiver) Multiplexer

MultiplexerOf wraps wg as a simple Multiplexer implementation. DemultiplexerOf should be used on the receiving end.

type PacketConn added in v0.2.7

type PacketConn struct {
	*PacketReaderChainer
	PacketWriterGiver
}

PacketConn is a convenience type to quickly obtain a Conn from an io.ReadWriter.

func PacketConnMake added in v0.2.7

func PacketConnMake(rw io.ReadWriter) PacketConn

type PacketReader added in v0.2.7

type PacketReader struct {
	// contains filtered or unexported fields
}

PacketReader is a basic Reader implementation that can be used to adapt an io.Reader to this package's conventions. It must be used in tandem with a PacketWriter.

A PacketReader can be used to read a single message, and then must be discarded. Closing it does not close the underlying io.Reader.

It is an error to neither Close the PacketReader, nor read from it until EOF, and will very likely lead to undefined behaviour.

func PacketReaderMake added in v0.2.8

func PacketReaderMake(r io.Reader) *PacketReader

func (*PacketReader) Close added in v0.2.7

func (x *PacketReader) Close() error

Close discards any unread message data.

func (*PacketReader) Read added in v0.2.7

func (x *PacketReader) Read(b []byte) (int, error)

Read reads from the first encountered message into b.

Internally, a PacketReader will process as many packets as necessary to fulfill a Read. Callers need not concern themselves with packet size considerations.

type PacketReaderChainer added in v0.2.7

type PacketReaderChainer struct {
	// contains filtered or unexported fields
}

A PacketReaderChainer adapts an io.Reader to a ReaderChainer. The passed Readers will be PacketReaders, thus the write side must use PacketWriters.

Inactive until the Listen method is used.

func PacketReaderChainerMake added in v0.2.8

func PacketReaderChainerMake(r io.Reader) *PacketReaderChainer

func (*PacketReaderChainer) Listen added in v0.2.7

func (x *PacketReaderChainer) Listen() error

Listen executes a message receiving loop. It will only return on chained ReaderTaker error.

func (*PacketReaderChainer) ReaderChain added in v0.2.7

func (x *PacketReaderChainer) ReaderChain(rt ReaderTaker) error

type PacketWriter added in v0.2.7

type PacketWriter struct {
	// contains filtered or unexported fields
}

PacketWriter is a basic Writer implementation that can be used to adapt an io.Writer to this package's conventions. It must be used in tandem with a PacketReader.

A PacketWriter can be used to write a single message (up to the first Close method call), and then must be discarded. Closing it does not close the underling io.Writer.

func PacketWriterMake added in v0.2.8

func PacketWriterMake(w io.Writer) *PacketWriter

func (*PacketWriter) Close added in v0.2.7

func (x *PacketWriter) Close() error

Close terminates the message. Any subsequent Write calls will NoOp. If no valid Write calls had ever been made before closing, the message is effectively aborted (i.e. a PacketReader will not see a empty messages).

func (*PacketWriter) Write added in v0.2.7

func (x *PacketWriter) Write(b []byte) (int, error)

Write writes a new packet with content b. The caller controls packet size through len(b). Does nothing if len(b) == 0.

type PacketWriterGiver added in v0.2.7

type PacketWriterGiver struct {
	W io.Writer
}

A PacketWriterGiver wraps an io.Writer to function as a WriterGiver. The returned Writers will be PacketWriters, thus the read side must use PacketReaders.

func (PacketWriterGiver) Writer added in v0.2.7

func (x PacketWriterGiver) Writer() (Writer, error)

type Reader

type Reader = io.Reader

type ReaderChainer

type ReaderChainer = msg.ReaderChainer[Reader]

func ReaderChainerOf

func ReaderChainerOf(d Demultiplexer, ch byte) ReaderChainer

type ReaderChainerAsync

type ReaderChainerAsync struct {
	// contains filtered or unexported fields
}

ReaderChainerAsync wraps a ReaderChainer to chain asynchronously. Its ReaderTake method will return once the chained Reader is closed. Must not be used if the ReaderChainer can start multiple concurrent chains.

func ReaderChainerAsyncMake added in v0.2.8

func ReaderChainerAsyncMake(rc ReaderChainer) (*ReaderChainerAsync, error)

func (*ReaderChainerAsync) ReaderChain

func (x *ReaderChainerAsync) ReaderChain(rt ReaderTaker) error

Never returns an error.

func (*ReaderChainerAsync) ReaderTake

func (x *ReaderChainerAsync) ReaderTake(r Reader) error

Never returns an error.

type ReaderGiver

type ReaderGiver = msg.ReaderGiver[Reader]

type ReaderTaker

type ReaderTaker = msg.ReaderTaker[Reader]

type Void

type Void struct{}

func (Void) Close

func (x Void) Close() error

func (Void) ReaderTake

func (x Void) ReaderTake(r Reader) error

func (Void) Write

func (x Void) Write(b []byte) (int, error)

type WriteCanceler

type WriteCanceler interface {
	Writer
	msg.Canceler
}

type Writer

type Writer = io.Writer

type WriterGiver

type WriterGiver = msg.WriterGiver[Writer]

func WriterGiverOf

func WriterGiverOf(m Multiplexer, ch byte) WriterGiver

type WriterGiverMutex

type WriterGiverMutex struct {
	// contains filtered or unexported fields
}

WriterGiverMutex wraps a WriterGiver to block while a provided Writer is in active use, making it concurrent safe. Unblocks when the Writer is closed.

func WriterGiverMutexMake added in v0.2.8

func WriterGiverMutexMake(wg WriterGiver) *WriterGiverMutex

func (*WriterGiverMutex) Writer

func (x *WriterGiverMutex) Writer() (Writer, error)

Jump to

Keyboard shortcuts

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