Session.State().Get/Set do not appear to work
- Dominant language
- Go
- Stars
- 8.8k
- Forks
- 1k
- Avg merge
- 3d 18h
- Merged PRs (30d)
- 88
Description
I tried the following basic get/set with both in-memory and database, neither work as expected and have the same output, notably they both show the state value just after being set, but it never seems to retain after the function return
> [!CAUTION]
> none of the state prefixes appear to work
Not sure if I'm doing something wrong, or there is a copy in the implementation which means this never makes it back to storage...?
```go
func sessionGetState(r *runtime.Runtime, c *runtime.Client, m *runtime.Message) {
var s StatePayload
if err := json.Unmarshal(m.Payload, &s); err != nil {
log.Printf("Error unmarshaling 'session.getState' payload: %v", err)
return
}
// lookup session
resp, err := r.S.Get(r.Ctx, &session.GetRequest{
AppName: r.AppName,
UserID: c.User,
SessionID: s.Sid,
})
if err != nil {
...
}
v, err := resp.Session.State().Get(s.Key)
if err != nil {
...
}
s.Val = v
// fmt.Println("mailing sessions", payload)
c.Mail("session.getState.resp", s)
}
func sessionPutState(r *runtime.Runtime, c *runtime.Client, m *runtime.Message) {
var s StatePayload
if err := json.Unmarshal(m.Payload, &s); err != nil {
log.Printf("Error unmarshaling 'session.getState' payload: %v", err)
return
}
// lookup session
resp, err := r.S.Get(r.Ctx, &session.GetRequest{
AppName: r.AppName,
UserID: c.User,
SessionID: s.Sid,
})
if err != nil {
...
}
err = resp.Session.State().Set(s.Key, s.Val)
if err != nil {
...
}
fmt.Println("session.state", maps.Collect(resp.Session.State().All()))
}
```
```
Received message type: session.state.put
sessionPutState {28b3c4f4-d140-4409-ad0c-56336ad4971c title testing}
State Set 28b3c4f4-d140-4409-ad0c-56336ad4971c title testing
session.state map[title:testing]
Received message type: session.get
sessionGet {"id":"28b3c4f4-d140-4409-ad0c-56336ad4971c"}
Received message type: session.state.put
sessionPutState {28b3c4f4-d140-4409-ad0c-56336ad4971c foo bar}
State Set 28b3c4f4-d140-4409-ad0c-56336ad4971c foo bar
session.state map[foo:bar]
Received message type: session.state.get
Error: session.getState.getState: state key does not exist
Received message type: session.state.put
sessionPutState {28b3c4f4-d140-4409-ad0c-56336ad4971c user:name verdverm}
State Set 28b3c4f4-d140-4409-ad0c-56336ad4971c user:name verdverm
session.state map[user:name:verdverm]
Received message type: session.state.get
Error: session.getState.getState: state key does not exist
```
Contributor guide
Research direction
Reproduce the example using both the in-memory and database session implementations, starting with the Session.State().Set and Get calls in sessionPutState and sessionGetState. Inspect how state is persisted after the function returns; done means values set under each prefix can be retrieved by a later session.state.get request for both backends.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100