mirror of
https://github.com/pion/webrtc.git
synced 2025-09-27 03:25:58 +08:00
115 lines
1.8 KiB
Go
115 lines
1.8 KiB
Go
// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
// Package signal contains helpers to exchange the SDP session
|
|
// description between examples.
|
|
package signal
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"compress/gzip"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// Allows compressing offer/answer to bypass terminal input limits.
|
|
const compress = false
|
|
|
|
// MustReadStdin blocks until input is received from stdin
|
|
func MustReadStdin() string {
|
|
r := bufio.NewReader(os.Stdin)
|
|
|
|
var in string
|
|
for {
|
|
var err error
|
|
in, err = r.ReadString('\n')
|
|
if err != io.EOF {
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
in = strings.TrimSpace(in)
|
|
if len(in) > 0 {
|
|
break
|
|
}
|
|
}
|
|
|
|
fmt.Println("")
|
|
|
|
return in
|
|
}
|
|
|
|
// Encode encodes the input in base64
|
|
// It can optionally zip the input before encoding
|
|
func Encode(obj interface{}) string {
|
|
b, err := json.Marshal(obj)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if compress {
|
|
b = zip(b)
|
|
}
|
|
|
|
return base64.StdEncoding.EncodeToString(b)
|
|
}
|
|
|
|
// Decode decodes the input from base64
|
|
// It can optionally unzip the input after decoding
|
|
func Decode(in string, obj interface{}) {
|
|
b, err := base64.StdEncoding.DecodeString(in)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if compress {
|
|
b = unzip(b)
|
|
}
|
|
|
|
err = json.Unmarshal(b, obj)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func zip(in []byte) []byte {
|
|
var b bytes.Buffer
|
|
gz := gzip.NewWriter(&b)
|
|
_, err := gz.Write(in)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
err = gz.Flush()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
err = gz.Close()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return b.Bytes()
|
|
}
|
|
|
|
func unzip(in []byte) []byte {
|
|
var b bytes.Buffer
|
|
_, err := b.Write(in)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
r, err := gzip.NewReader(&b)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
res, err := ioutil.ReadAll(r)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return res
|
|
}
|