Documentation
¶
Index ¶
- Variables
- func CloseOrLog(name string, c Closable)
- func ConfigureLogging()
- func IsRunningWithLambda() bool
- func MustDeserialize[T any](b []byte) T
- func MustSerialize(v interface{}) []byte
- func UnmarshalMessagePayload[MessageType MessageBase[T], T any](message *Message) (*MessageType, error)
- func UnmarshalResponsePayload[ResponseType ResponseBase[T], T any](response *Response) (*ResponseType, error)
- type Application
- type ApplicationRegistry
- type Closable
- type Consumer
- type Endpoint
- type Handler
- type Message
- type MessageBase
- type MessageKind
- type Pinger
- type ProxyError
- type Publisher
- type Response
- type ResponseBase
- type Tunnel
Constants ¶
This section is empty.
Variables ¶
var ErrApplicationNotFound = errors.New("application not found")
ErrApplicationNotFound is returned when an application is not found.
var ErrNoActiveConsumer = errors.New("no consumer is active on this tunnel")
ErrNoActiveConsumer is returned when a consumer is not active on a tunnel.
var ErrPubSubChannelClosed = fmt.Errorf("pubsub channel closed")
Functions ¶
func CloseOrLog ¶
CloseOrLog closes the given closable, logging any errors (but continuing execution).
func ConfigureLogging ¶
func ConfigureLogging()
ConfigureLogging configures slog to log to stdout at the given level. If FUNCIE_LOG_LEVEL is set, it will be used as the log level. Otherwise, the default is Info.
func IsRunningWithLambda ¶
func IsRunningWithLambda() bool
IsRunningWithLambda returns true if the current process is running in AWS Lambda.
func MustDeserialize ¶
MustDeserialize deserializes the given JSON to the given type, or panics if it fails.
func MustSerialize ¶
func MustSerialize(v interface{}) []byte
MustSerialize serializes the given value to JSON, or panics if it fails.
func UnmarshalMessagePayload ¶
func UnmarshalMessagePayload[MessageType MessageBase[T], T any](message *Message) (*MessageType, error)
UnmarshalMessagePayload unmarshals the payload of the given message into the given payload type.
func UnmarshalResponsePayload ¶
func UnmarshalResponsePayload[ResponseType ResponseBase[T], T any](response *Response) (*ResponseType, error)
UnmarshalResponsePayload unmarshals the payload of the given response into the given payload type.
Types ¶
type Application ¶
type Application struct {
// Name is the name of the application.
Name string `json:"name"`
// Endpoint is the address to send requests to.
Endpoint Endpoint `json:"endpoint"`
}
Application represents a registered application that can have requests routed to it.
func NewApplication ¶
func NewApplication(name string, endpoint Endpoint) *Application
NewApplication creates a new Application with the given name and endpoint.
func (*Application) String ¶
func (a *Application) String() string
String returns a string representation of the application.
type ApplicationRegistry ¶
type ApplicationRegistry interface {
// Register registers the given application.
Register(ctx context.Context, application *Application) error
// Unregister unregisters the application with the given name.
Unregister(ctx context.Context, applicationName string) error
// GetApplication gets the application with the given name.
// If no application is registered with the given name, ErrApplicationNotFound is returned.
GetApplication(ctx context.Context, applicationName string) (*Application, error)
}
ApplicationRegistry is a service that can register and unregister applications.
type Consumer ¶
type Consumer interface {
Connect(ctx context.Context) error
Consume(ctx context.Context) error
Subscribe(ctx context.Context, applicationId string, handler Handler) error
Unsubscribe(ctx context.Context, applicationId string) error
}
Consumer represents a consumer of a synchronous tunnel that can be used to receive messages from a publisher and send a response.
type Endpoint ¶
type Endpoint struct {
// Scheme is the protocol scheme of the endpoint.
// This is usually "http" or "https".
Scheme string `json:"protocol"`
// Host is the host name or IP address of the endpoint.
// This does not include the protocol or port.
Host string `json:"host"`
// Port is the port number of the endpoint.
Port int `json:"port"`
}
Endpoint represents a target destination for funcie requests or bastions.
func MustNewEndpointFromAddress ¶
MustNewEndpointFromAddress creates a new funcie Endpoint from parsing the given address.
func NewEndpoint ¶
NewEndpoint creates a new Endpoint with the given scheme, host, and port.
func NewEndpointFromAddress ¶
NewEndpointFromAddress creates a new funcie Endpoint from parsing the given address. Example: https://127.0.0.1:8080
type Message ¶
type Message = MessageBase[json.RawMessage]
func MarshalMessagePayload ¶
func MarshalMessagePayload[MessageType MessageBase[T], T any](message MessageType) (*Message, error)
MarshalMessagePayload marshals the given payload into a message with a serialized raw payload.
func NewMessage ¶
func NewMessage(application string, kind MessageKind, payload []byte) *Message
NewMessage creates a new message with the given payload.
type MessageBase ¶
type MessageBase[T any] struct { // ID is the unique identifier for this message. ID string `json:"id"` // Kind is the type of message that is being sent. Kind MessageKind `json:"kind"` // Application is the name of the application that this message is for. Application string `json:"application"` // Payload is the actual message payload. Payload T `json:"payload"` // Created is the time the message was created. Created time.Time `json:"created"` }
MessageBase represents a message to be sent through a tunnel, typed to a specific payload kind. The generic message is aliased as Message, to allow for untyped use.
func NewMessageWithPayload ¶
func NewMessageWithPayload[T any](application string, kind MessageKind, payload T) *MessageBase[T]
NewMessageWithPayload creates a new message with the given payload, which is serialized using funcie.MustSerialize.
func (*MessageBase[T]) String ¶
func (m *MessageBase[T]) String() string
type Pinger ¶
type Pinger interface {
Ping(app Application) error
}
Pinger is an interface for pinging applications.
type ProxyError ¶
type ProxyError struct {
// Message is the error message.
Message string `json:"message,omitempty"`
}
ProxyError is an error that can be sent through a tunnel.
func NewProxyError ¶
func NewProxyError(message string) *ProxyError
NewProxyError creates a new ProxyError with the given message.
func NewProxyErrorFromError ¶
func NewProxyErrorFromError(err error) *ProxyError
NewProxyErrorFromError creates a new ProxyError from the given error. If the error is nil, nil is returned.
func (*ProxyError) MarshalJSON ¶
func (e *ProxyError) MarshalJSON() ([]byte, error)
MarshalJSON implements json.Marshaler.
func (*ProxyError) UnmarshalJSON ¶
func (e *ProxyError) UnmarshalJSON(data []byte) error
UnmarshalJSON implements json.Unmarshaler.
type Publisher ¶
type Publisher interface {
// Publish publishes a message to the tunnel, synchronously waiting for a response from the other side.
// If no consumer is active, ErrNoConsumerActive is returned.
Publish(ctx context.Context, message *Message) (*Response, error)
}
Publisher represents the publishing a synchronous tunnel that can be used to send messages to a consumer and wait for a response.
type Response ¶
type Response = ResponseBase[json.RawMessage]
Response is a response to a message sent to a tunnel, with either a generic JSON payload or an error.
func MarshalResponsePayload ¶
func MarshalResponsePayload[T any](response *ResponseBase[T]) (*Response, error)
MarshalResponsePayload marshals the payload of the given response into a JSON byte array.
type ResponseBase ¶
type ResponseBase[T any] struct { // ID is the unique identifier for this message. ID string `json:"id"` // Data is the actual message payload, or nil if an error occurred. // Exactly one of Data or Error are not nil. Data *T `json:"data,omitempty"` // Error is the error that occurred, or nil if no error occurred. // Exactly one of Data or Error are not nil. Error *ProxyError `json:"error,omitempty"` // Received is the time the response was received. Received time.Time `json:"received"` }
ResponseBase represents a response to a message sent to a tunnel, with either a generic payload or an error.
func NewResponseWithPayload ¶
func NewResponseWithPayload[T any](id string, payload *T, error error) *ResponseBase[T]
NewResponseWithPayload creates a new response with the given payload, which is serialized using funcie.MustSerialize, and the current time as the received time.
type Tunnel ¶
type Tunnel interface {
// Start starts the tunnel. This function never returns.
// The handler is the handler that will be invoked when a request is received.
// It is subject to the same restrictions as the handler for the serverless function provider (such as lambda.Start).
Start()
}