1// Package signal contains helpers to exchange the SDP session
2// description between examples.
3package signal
4
5import (
6	"bufio"
7	"bytes"
8	"compress/gzip"
9	"encoding/base64"
10	"encoding/json"
11	"fmt"
12	"io"
13	"io/ioutil"
14	"os"
15	"strings"
16)
17
18// Allows compressing offer/answer to bypass terminal input limits.
19const compress = false
20
21// MustReadStdin blocks until input is received from stdin
22func MustReadStdin() string {
23	r := bufio.NewReader(os.Stdin)
24
25	var in string
26	for {
27		var err error
28		in, err = r.ReadString('\n')
29		if err != io.EOF {
30			if err != nil {
31				panic(err)
32			}
33		}
34		in = strings.TrimSpace(in)
35		if len(in) > 0 {
36			break
37		}
38	}
39
40	fmt.Println("")
41
42	return in
43}
44
45// Encode encodes the input in base64
46// It can optionally zip the input before encoding
47func Encode(obj interface{}) string {
48	b, err := json.Marshal(obj)
49	if err != nil {
50		panic(err)
51	}
52
53	if compress {
54		b = zip(b)
55	}
56
57	return base64.StdEncoding.EncodeToString(b)
58}
59
60// Decode decodes the input from base64
61// It can optionally unzip the input after decoding
62func Decode(in string, obj interface{}) {
63	b, err := base64.StdEncoding.DecodeString(in)
64	if err != nil {
65		panic(err)
66	}
67
68	if compress {
69		b = unzip(b)
70	}
71
72	err = json.Unmarshal(b, obj)
73	if err != nil {
74		panic(err)
75	}
76}
77
78func zip(in []byte) []byte {
79	var b bytes.Buffer
80	gz := gzip.NewWriter(&b)
81	_, err := gz.Write(in)
82	if err != nil {
83		panic(err)
84	}
85	err = gz.Flush()
86	if err != nil {
87		panic(err)
88	}
89	err = gz.Close()
90	if err != nil {
91		panic(err)
92	}
93	return b.Bytes()
94}
95
96func unzip(in []byte) []byte {
97	var b bytes.Buffer
98	_, err := b.Write(in)
99	if err != nil {
100		panic(err)
101	}
102	r, err := gzip.NewReader(&b)
103	if err != nil {
104		panic(err)
105	}
106	res, err := ioutil.ReadAll(r)
107	if err != nil {
108		panic(err)
109	}
110	return res
111}
112