forked from andyleap/go-ssb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
muxrpcManager.go
47 lines (36 loc) · 950 Bytes
/
muxrpcManager.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
package muxrpcManager
import (
"encoding/json"
"io"
"sync"
"github.com/andyleap/go-ssb"
"github.com/andyleap/muxrpc"
)
type ExtraData struct {
Lock sync.Mutex
Conns map[ssb.Ref]*muxrpc.Conn
}
func init() {
ssb.RegisterInit(func(ds *ssb.DataStore) {
ed := &ExtraData{Conns: map[ssb.Ref]*muxrpc.Conn{}}
ds.SetExtraData("muxrpcConns", ed)
})
}
func HandleConn(ds *ssb.DataStore, ref ssb.Ref, conn io.ReadWriteCloser) {
ed := ds.ExtraData("muxrpcConns").(*ExtraData)
handlers := ds.ExtraData("muxrpcHandlers").(map[string]func(conn *muxrpc.Conn, req int32, args json.RawMessage))
muxConn := muxrpc.New(conn, handlers)
ed.Lock.Lock()
ed.Conns[ref] = muxConn
ed.Lock.Unlock()
onConnect, onConnectOK := ds.ExtraData("muxrpcOnConnect").(map[string]func(conn *muxrpc.Conn))
if onConnectOK {
for _, oc := range onConnect {
go oc(muxConn)
}
}
muxConn.Handle()
ed.Lock.Lock()
delete(ed.Conns, ref)
ed.Lock.Unlock()
}