-
Notifications
You must be signed in to change notification settings - Fork 0
/
session.go
71 lines (57 loc) · 1.79 KB
/
session.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package main
import (
"context"
"database/sql"
"encoding/json"
"fmt"
"time"
)
// sessionData is the persisted state for a session
//
// TODO - back this on to something persistent, like the DB
type sessionData struct {
// LatestSequence shows the newest sequence we've served. This won't be the
// latest overall, but the sequence for the first media segment in the
// playlist (i.e what we set EXT-X-MEDIA-SEQUENCE to)
LatestSequence int `json:"latestSequence"`
// IntroducedAt records when we first saw it
IntroducedAt time.Time `json:"introducedAt"`
StreamID string `json:"streamID"`
Timezone string `json:"timezone"`
}
type sessionStore struct {
db *sql.DB
}
func newSessionStore(db *sql.DB) *sessionStore {
return &sessionStore{
db: db,
}
}
// Get fetches or initializes session data for a given session
func (s *sessionStore) Get(ctx context.Context, sid string) (sessionData, error) {
var data []byte
err := s.db.QueryRowContext(ctx, `select data from sessions where id = $1`, sid).Scan(&data)
if err == sql.ErrNoRows {
return sessionData{}, nil
} else if err != nil {
return sessionData{}, fmt.Errorf("getting session %s: %v", sid, err)
}
sd := sessionData{}
if err := json.Unmarshal(data, &sd); err != nil {
return sessionData{}, fmt.Errorf("unmarshaling session %s: %v", sid, err)
}
return sd, nil
}
// Sets the data for the given session ID
func (s *sessionStore) Set(ctx context.Context, sid string, d sessionData) error {
data, err := json.Marshal(&d)
if err != nil {
return fmt.Errorf("marshaling data for session %s: %v", sid, err)
}
if _, err := s.db.ExecContext(ctx,
`insert or replace into sessions (id, data, updated_at) values ($1, $2, $3)`,
sid, data, time.Now()); err != nil {
return fmt.Errorf("upserting session %s: %v", sid, err)
}
return nil
}