package server

import (
	"github.com/go-stomp/stomp/v3/frame"
)

// QueueStorage is an interface that abstracts the queue storage mechanism.
// The intent is that different queue storage implementations can be
// used, depending on preference. Queue storage mechanisms could include
// in-memory, and various persistent storage mechanisms (eg file system, DB, etc).
type QueueStorage interface {
	// Enqueue adds a MESSAGE frame to the end of the queue.
	Enqueue(queue string, frame *frame.Frame) error

	// Requeue adds a MESSAGE frame to the head of the queue.
	// This will happen if a client fails to acknowledge receipt.
	Requeue(queue string, frame *frame.Frame) error

	// Dequeue removes a frame from the head of the queue.
	// Returns nil if no frame is available.
	Dequeue(queue string) (*frame.Frame, error)

	// Start is called at server startup. Allows the queue storage
	// to perform any initialization.
	Start()

	// Stop is called prior to server shutdown. Allows the queue storage
	// to perform any cleanup, such as flushing to disk.
	Stop()
}
