feat: game lobby service
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
// Package streamoffsetstub provides an in-process ports.StreamOffsetStore
|
||||
// used by worker-level tests that do not need Redis. Production code
|
||||
// never wires this stub.
|
||||
package streamoffsetstub
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"sync"
|
||||
|
||||
"galaxy/lobby/internal/ports"
|
||||
)
|
||||
|
||||
// Store is a concurrency-safe in-memory ports.StreamOffsetStore.
|
||||
type Store struct {
|
||||
mu sync.Mutex
|
||||
offsets map[string]string
|
||||
}
|
||||
|
||||
// NewStore constructs an empty Store.
|
||||
func NewStore() *Store {
|
||||
return &Store{offsets: make(map[string]string)}
|
||||
}
|
||||
|
||||
// Load returns the last saved entry id for streamLabel.
|
||||
func (store *Store) Load(ctx context.Context, streamLabel string) (string, bool, error) {
|
||||
if ctx == nil {
|
||||
return "", false, errors.New("load offset: nil context")
|
||||
}
|
||||
store.mu.Lock()
|
||||
defer store.mu.Unlock()
|
||||
value, ok := store.offsets[streamLabel]
|
||||
return value, ok, nil
|
||||
}
|
||||
|
||||
// Save records entryID as the offset for streamLabel.
|
||||
func (store *Store) Save(ctx context.Context, streamLabel, entryID string) error {
|
||||
if ctx == nil {
|
||||
return errors.New("save offset: nil context")
|
||||
}
|
||||
store.mu.Lock()
|
||||
defer store.mu.Unlock()
|
||||
store.offsets[streamLabel] = entryID
|
||||
return nil
|
||||
}
|
||||
|
||||
// Set forces the in-memory value for streamLabel; useful in tests to
|
||||
// pre-populate state.
|
||||
func (store *Store) Set(streamLabel, entryID string) {
|
||||
store.mu.Lock()
|
||||
defer store.mu.Unlock()
|
||||
store.offsets[streamLabel] = entryID
|
||||
}
|
||||
|
||||
// Compile-time interface assertion.
|
||||
var _ ports.StreamOffsetStore = (*Store)(nil)
|
||||
Reference in New Issue
Block a user