feat(store): expose workspace state directory config
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-04 16:24:27 +00:00
parent dfbdace985
commit 06f6229eaf
3 changed files with 47 additions and 1 deletions

2
doc.go
View file

@ -10,6 +10,8 @@
// journal, and purge interval are already known. Prefer the struct literal
// over `store.New(..., store.WithJournal(...))` when the full configuration is
// already available, because it reads as data rather than a chain of steps.
// Use `store.WithWorkspaceStateDirectory("/tmp/core-state")` when the
// workspace path is assembled incrementally rather than declared up front.
//
// Usage example:
//

View file

@ -169,6 +169,16 @@ func WithJournal(endpointURL, organisation, bucketName string) StoreOption {
}
}
// Usage example: `storeInstance, err := store.New(":memory:", store.WithWorkspaceStateDirectory("/tmp/core-state"))`
func WithWorkspaceStateDirectory(directory string) StoreOption {
return func(storeConfig *StoreConfig) {
if storeConfig == nil {
return
}
storeConfig.WorkspaceStateDirectory = directory
}
}
// Usage example: `config := storeInstance.JournalConfiguration(); fmt.Println(config.EndpointURL, config.Organisation, config.BucketName)`
func (storeInstance *Store) JournalConfiguration() JournalConfiguration {
if storeInstance == nil {
@ -194,7 +204,7 @@ func (storeInstance *Store) Config() StoreConfig {
DatabasePath: storeInstance.databasePath,
Journal: storeInstance.JournalConfiguration(),
PurgeInterval: storeInstance.purgeInterval,
WorkspaceStateDirectory: storeInstance.workspaceStateDirectoryPath(),
WorkspaceStateDirectory: storeInstance.WorkspaceStateDirectory(),
}
}
@ -206,6 +216,14 @@ func (storeInstance *Store) DatabasePath() string {
return storeInstance.databasePath
}
// Usage example: `stateDirectory := storeInstance.WorkspaceStateDirectory(); fmt.Println(stateDirectory)`
func (storeInstance *Store) WorkspaceStateDirectory() string {
if storeInstance == nil {
return normaliseWorkspaceStateDirectory(defaultWorkspaceStateDirectory)
}
return storeInstance.workspaceStateDirectoryPath()
}
// Usage example: `if storeInstance.IsClosed() { return }`
func (storeInstance *Store) IsClosed() bool {
if storeInstance == nil {

View file

@ -108,6 +108,23 @@ func TestStore_New_Good_WithJournalOption(t *testing.T) {
assert.Equal(t, "http://127.0.0.1:8086", storeInstance.journalConfiguration.EndpointURL)
}
func TestStore_New_Good_WithWorkspaceStateDirectoryOption(t *testing.T) {
workspaceStateDirectory := testPath(t, "workspace-state-option")
storeInstance, err := New(":memory:", WithWorkspaceStateDirectory(workspaceStateDirectory))
require.NoError(t, err)
defer storeInstance.Close()
assert.Equal(t, workspaceStateDirectory, storeInstance.WorkspaceStateDirectory())
workspace, err := storeInstance.NewWorkspace("scroll-session")
require.NoError(t, err)
defer workspace.Discard()
assert.Equal(t, workspaceFilePath(workspaceStateDirectory, "scroll-session"), workspace.DatabasePath())
assert.True(t, testFilesystem().Exists(workspace.DatabasePath()))
}
func TestStore_NewConfigured_Good_WorkspaceStateDirectory(t *testing.T) {
workspaceStateDirectory := testPath(t, "workspace-state")
@ -128,6 +145,15 @@ func TestStore_NewConfigured_Good_WorkspaceStateDirectory(t *testing.T) {
assert.True(t, testFilesystem().Exists(workspace.DatabasePath()))
}
func TestStore_WorkspaceStateDirectory_Good_Default(t *testing.T) {
storeInstance, err := New(":memory:")
require.NoError(t, err)
defer storeInstance.Close()
assert.Equal(t, normaliseWorkspaceStateDirectory(defaultWorkspaceStateDirectory), storeInstance.WorkspaceStateDirectory())
assert.Equal(t, storeInstance.WorkspaceStateDirectory(), storeInstance.Config().WorkspaceStateDirectory)
}
func TestStore_JournalConfiguration_Good(t *testing.T) {
storeInstance, err := New(":memory:", WithJournal("http://127.0.0.1:8086", "core", "events"))
require.NoError(t, err)