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