mirror of
				https://github.com/raz-varren/sacrificial-socket.git
				synced 2025-10-31 19:42:53 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			166 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"encoding/json"
 | |
| 	"flag"
 | |
| 	"log"
 | |
| 	"net/http"
 | |
| 	"os"
 | |
| 	"github.com/raz-varren/sacrificial-socket"
 | |
| 	"github.com/raz-varren/sacrificial-socket/backend/ssgrpc"
 | |
| 	"strings"
 | |
| 	//"time"
 | |
| )
 | |
| 
 | |
| type roomcast struct {
 | |
| 	Room string `json:"room"`
 | |
| 	Data string `json:"data"`
 | |
| }
 | |
| 
 | |
| type message struct {
 | |
| 	Message string `json:"message"`
 | |
| }
 | |
| 
 | |
| var (
 | |
| 	webPort      = flag.String("webport", ":8081", "host:port number used for webpage and socket connections")
 | |
| 	key          = flag.String("key", "./keys/snakeoil.key", "tls key used for grpc peer connections")
 | |
| 	cert         = flag.String("cert", "./keys/snakeoil.crt", "tls cert used for grpc peer connections")
 | |
| 	peerList     = flag.String("peers", "", "comma separated list of peerCN@host:port peers for grpc connections. if peerCN is not provided host will be used as the peer Common Name")
 | |
| 	sharedKey    = flag.String("sharedkey", "insecuresharedkeystring", "the shared key used to sign HMAC-SHA256 JWTs for authenticating grpc peers. must be the same on all peers")
 | |
| 	grpcHostPort = flag.String("grpchostport", ":30001", "listen host:port for grpc peer connections")
 | |
| 	insecure     = flag.Bool("insecure", false, "if the insecure flag is set, no tls or shared key authentication will be used in the grpc peer connections. insecure should not be used on production instances")
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 	flag.Parse()
 | |
| 
 | |
| 	s := ss.NewServer()
 | |
| 
 | |
| 	s.On("echo", Echo)
 | |
| 	s.On("echobin", EchoBin)
 | |
| 	s.On("echojson", EchoJSON)
 | |
| 	s.On("join", Join)
 | |
| 	s.On("leave", Leave)
 | |
| 	s.On("roomcast", Roomcast)
 | |
| 	s.On("roomcastbin", RoomcastBin)
 | |
| 	s.On("roomcastjson", RoomcastJSON)
 | |
| 	s.On("broadcast", Broadcast)
 | |
| 	s.On("broadcastbin", BroadcastBin)
 | |
| 	s.On("broadcastjson", BroadcastJSON)
 | |
| 
 | |
| 	if *peerList == "" {
 | |
| 		log.Println("must provide peers to connect to")
 | |
| 		flag.PrintDefaults()
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	peers := strings.Split(*peerList, ",")
 | |
| 
 | |
| 	var b ss.MultihomeBackend
 | |
| 
 | |
| 	if *insecure {
 | |
| 		b = ssgrpc.NewInsecureBackend(*grpcHostPort, peers)
 | |
| 	} else {
 | |
| 		b = ssgrpc.NewBackend(*key, *cert, *grpcHostPort, []byte(*sharedKey), peers)
 | |
| 	}
 | |
| 
 | |
| 	s.SetMultihomeBackend(b)
 | |
| 
 | |
| 	c := make(chan bool)
 | |
| 	s.EnableSignalShutdown(c)
 | |
| 
 | |
| 	go func() {
 | |
| 		<-c
 | |
| 		os.Exit(0)
 | |
| 	}()
 | |
| 
 | |
| 	http.Handle("/socket", s.WebHandler())
 | |
| 	http.Handle("/", http.FileServer(http.Dir("webroot")))
 | |
| 
 | |
| 	var err error
 | |
| 	if *insecure {
 | |
| 		err = http.ListenAndServe(*webPort, nil)
 | |
| 	} else {
 | |
| 		err = http.ListenAndServeTLS(*webPort, *cert, *key, nil)
 | |
| 	}
 | |
| 
 | |
| 	if err != nil {
 | |
| 		log.Fatalln(err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func Echo(s *ss.Socket, data []byte) {
 | |
| 	s.Emit("echo", string(data))
 | |
| }
 | |
| 
 | |
| func EchoBin(s *ss.Socket, data []byte) {
 | |
| 	s.Emit("echobin", data)
 | |
| }
 | |
| 
 | |
| func EchoJSON(s *ss.Socket, data []byte) {
 | |
| 	var m message
 | |
| 	err := json.Unmarshal(data, &m)
 | |
| 	check(err)
 | |
| 	
 | |
| 	s.Emit("echojson", m)
 | |
| }
 | |
| 
 | |
| func Join(s *ss.Socket, data []byte) {
 | |
| 	d := string(data)
 | |
| 	s.Join(d)
 | |
| 	s.Emit("echo", "joined room:" + d)
 | |
| }
 | |
| 
 | |
| func Leave(s *ss.Socket, data []byte) {
 | |
| 	d := string(data)
 | |
| 	s.Leave(d)
 | |
| 	s.Emit("echo", "left room:" + d)
 | |
| }
 | |
| 
 | |
| func Roomcast(s *ss.Socket, data []byte) {
 | |
| 	var r roomcast
 | |
| 	err := json.Unmarshal(data, &r)
 | |
| 	check(err)
 | |
| 
 | |
| 	s.Roomcast(r.Room, "roomcast", r.Data)
 | |
| }
 | |
| 
 | |
| func RoomcastBin(s *ss.Socket, data []byte) {
 | |
| 	var r roomcast
 | |
| 	err := json.Unmarshal(data, &r)
 | |
| 	check(err)
 | |
| 	
 | |
| 	s.Roomcast(r.Room, "roomcastbin", []byte(r.Data))
 | |
| }
 | |
| 
 | |
| func RoomcastJSON(s *ss.Socket, data []byte) {
 | |
| 	var r roomcast
 | |
| 	err := json.Unmarshal(data, &r)
 | |
| 	check(err)
 | |
| 
 | |
| 	s.Roomcast(r.Room, "roomcastjson", r)
 | |
| }
 | |
| 
 | |
| 
 | |
| func Broadcast(s *ss.Socket, data []byte) {
 | |
| 	s.Broadcast("broadcast", string(data))
 | |
| }
 | |
| 
 | |
| func BroadcastBin(s *ss.Socket, data []byte){
 | |
| 	s.Broadcast("broadcastbin", data)
 | |
| }
 | |
| 
 | |
| func BroadcastJSON(s *ss.Socket, data []byte) {
 | |
| 	var m message
 | |
| 	err := json.Unmarshal(data, &m)
 | |
| 	check(err)
 | |
| 	
 | |
| 	s.Broadcast("broadcastjson", m)
 | |
| }
 | |
| 
 | |
| func check(err error) {
 | |
| 	if err != nil {
 | |
| 		log.Println(err)
 | |
| 	}
 | |
| }
 | 
