summaryrefslogtreecommitdiff
path: root/server/session/session.go
blob: 54b6d14913ee8fc2cfcf1390587a15716b870e62 (plain)
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
package session

import (
	"citrons.xyz/talk/proto"
)

type Session struct {
	send chan<- proto.Line
	UserId string
	subscribedTo map[*Stream]bool
}

func NewSession(send chan<- proto.Line) *Session {
	var s Session
	s.send = send
	s.subscribedTo = make(map[*Stream]bool)
	return &s
}

func (s *Session) Event(ev proto.Command) {
	s.send <- proto.Line {'*', "", ev}
}

func (s *Session) Subscriptions() map[*Stream]bool {
	return s.subscribedTo
}

func (s *Session) Subscribe(to *Stream) {
	s.subscribedTo[to] = true
	if to.subscribers == nil {
		to.subscribers = make(map[*Session]bool)
	}
	to.subscribers[s] = true
}

func (s *Session) Unsubscribe(to *Stream) {
	delete(s.subscribedTo, to)
	if to.subscribers != nil {
		delete(to.subscribers, s)
	}
}

type Stream struct {
	subscribers map[*Session]bool
}

func (s *Stream) Subscribers() map[*Session]bool {
	return s.subscribers
}

func (s *Stream) Event(ev proto.Command) {
	for sub, _ := range s.subscribers {
		sub.Event(ev)
	}
}

func (s *Stream) UnsubscribeAll() {
	for sub, _ := range s.subscribers {
		sub.Unsubscribe(s)
	}
}

type Request struct {
	From *Session
	RequestId string
	Cmd proto.Command
}

func (r Request) Reply(reply proto.Command) {
	r.From.send <- proto.Line {'!', r.RequestId, reply}
}

func (r Request) ReplyInvalid() {
	r.Reply(proto.Fail{"invalid", "", nil}.Cmd())
}