forked from AplaProject/go-apla
-
Notifications
You must be signed in to change notification settings - Fork 0
/
multi_request_buffer.go
92 lines (71 loc) · 1.67 KB
/
multi_request_buffer.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package tx
import (
"sync"
"time"
"github.com/ug93tad/go-apla/packages/utils"
)
type MultiRequest struct {
ID string
Time time.Time
Contracts []MultiRequestContract
}
func (mr *MultiRequest) AddContract(contract string, params map[string]string) {
mr.Contracts = append(mr.Contracts, MultiRequestContract{
Contract: contract,
Params: params,
})
}
type MultiRequestContract struct {
Contract string
Params map[string]string
}
type MultiRequestBuffer struct {
mutex sync.Mutex
requestExpire time.Duration
requests map[string]*MultiRequest
}
func (mrb *MultiRequestBuffer) NewMultiRequest() *MultiRequest {
r := &MultiRequest{
ID: utils.UUID(),
Time: time.Now(),
Contracts: make([]MultiRequestContract, 0),
}
return r
}
func (mrb *MultiRequestBuffer) AddRequest(mr *MultiRequest) {
mrb.mutex.Lock()
defer mrb.mutex.Unlock()
mrb.requests[mr.ID] = mr
}
func (mrb *MultiRequestBuffer) GetRequest(id string) (*MultiRequest, bool) {
mrb.mutex.Lock()
defer mrb.mutex.Unlock()
r, ok := mrb.requests[id]
if !ok {
return nil, false
}
return r, true
}
func (mrb *MultiRequestBuffer) waitForCleaning() {
ticker := time.NewTicker(mrb.requestExpire)
for t := range ticker.C {
mrb.clean(t)
}
}
func (mrb *MultiRequestBuffer) clean(t time.Time) {
mrb.mutex.Lock()
defer mrb.mutex.Unlock()
for id, r := range mrb.requests {
if t.Sub(r.Time) > mrb.requestExpire {
delete(mrb.requests, id)
}
}
}
func NewMultiRequestBuffer(requestExpire time.Duration) *MultiRequestBuffer {
mrb := &MultiRequestBuffer{
requests: make(map[string]*MultiRequest),
requestExpire: requestExpire,
}
go mrb.waitForCleaning()
return mrb
}