@@ -10,20 +10,48 @@ import (
1010type InMemory struct {
1111 MessageIDIndex map [string ]int
1212 Messages []* data.Message
13+
14+ sliceIndexMap map [int ]string
15+ messageLimit int
16+ writeIndex int
1317}
1418
1519// CreateInMemory creates a new in memory storage backend
1620func CreateInMemory () * InMemory {
1721 return & InMemory {
1822 MessageIDIndex : make (map [string ]int ),
1923 Messages : make ([]* data.Message , 0 ),
24+ sliceIndexMap : make (map [int ]string ),
2025 }
2126}
2227
28+ // Set a limit on the number of messages that will be stored.
29+ // Once this limit is reached, the oldest message will be overwritten
30+ // by every new message.
31+ func (memory * InMemory ) SetMessageLimit (limit int ) error {
32+ memory .messageLimit = limit
33+ return nil
34+ }
35+
2336// Store stores a message and returns its storage ID
2437func (memory * InMemory ) Store (m * data.Message ) (string , error ) {
25- memory .Messages = append (memory .Messages , m )
26- memory .MessageIDIndex [string (m .ID )] = len (memory .Messages ) - 1
38+ if memory .messageLimit > 0 && len (memory .Messages ) == memory .messageLimit {
39+ // overwrite oldest message
40+ memory .Messages [memory .writeIndex ] = m
41+ messageID := memory .sliceIndexMap [memory .writeIndex ]
42+ delete (memory .MessageIDIndex , messageID )
43+ memory .MessageIDIndex [string (m .ID )] = memory .writeIndex
44+ memory .sliceIndexMap [memory .writeIndex ] = string (m .ID )
45+ memory .writeIndex ++
46+ // if we reach the end of the slice then start over
47+ if memory .writeIndex == len (memory .Messages ) {
48+ memory .writeIndex = 0
49+ }
50+ } else {
51+ memory .Messages = append (memory .Messages , m )
52+ memory .MessageIDIndex [string (m .ID )] = len (memory .Messages ) - 1
53+ memory .sliceIndexMap [len (memory .Messages )- 1 ] = string (m .ID )
54+ }
2755 return string (m .ID ), nil
2856}
2957
0 commit comments