making the linter happy
This commit is contained in:
@@ -2,7 +2,6 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/grafov/bcast"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -10,7 +9,7 @@ import (
|
|||||||
"github.com/42wim/matterbridge/bridge"
|
"github.com/42wim/matterbridge/bridge"
|
||||||
"github.com/42wim/matterbridge/bridge/config"
|
"github.com/42wim/matterbridge/bridge/config"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
//"github.com/grafov/bcast"
|
"github.com/grafov/bcast"
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"github.com/labstack/echo/v4/middleware"
|
"github.com/labstack/echo/v4/middleware"
|
||||||
ring "github.com/zfjagann/golang-ring"
|
ring "github.com/zfjagann/golang-ring"
|
||||||
@@ -28,12 +27,8 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type API struct {
|
type API struct {
|
||||||
Messages ring.Ring
|
Messages ring.Ring
|
||||||
group bcast.Group
|
group bcast.Group
|
||||||
//messageMember bcast.Member
|
|
||||||
//messageChannel chan config.Message
|
|
||||||
//streamMember bcast.Member
|
|
||||||
//streamChannel chan config.Message
|
|
||||||
sync.RWMutex
|
sync.RWMutex
|
||||||
*bridge.Config
|
*bridge.Config
|
||||||
}
|
}
|
||||||
@@ -48,7 +43,7 @@ type Message struct {
|
|||||||
|
|
||||||
type MessageWrapper struct {
|
type MessageWrapper struct {
|
||||||
message config.Message
|
message config.Message
|
||||||
member *bcast.Member
|
member *bcast.Member
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(cfg *bridge.Config) bridge.Bridger {
|
func New(cfg *bridge.Config) bridge.Bridger {
|
||||||
@@ -62,8 +57,6 @@ func New(cfg *bridge.Config) bridge.Bridger {
|
|||||||
b.Messages = ring.Ring{}
|
b.Messages = ring.Ring{}
|
||||||
if b.GetInt("Buffer") != 0 {
|
if b.GetInt("Buffer") != 0 {
|
||||||
b.Messages.SetCapacity(b.GetInt("Buffer"))
|
b.Messages.SetCapacity(b.GetInt("Buffer"))
|
||||||
} else {
|
|
||||||
// TODO: set default capacity ?
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if b.GetString("Token") != "" {
|
if b.GetString("Token") != "" {
|
||||||
@@ -96,14 +89,14 @@ func New(cfg *bridge.Config) bridge.Bridger {
|
|||||||
func (b *API) Connect() error {
|
func (b *API) Connect() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *API) Disconnect() error {
|
func (b *API) Disconnect() error {
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
func (b *API) JoinChannel(channel config.ChannelInfo) error {
|
|
||||||
// we could have a `chan config.Message` for each text channel here, instead of hardcoded "api"
|
|
||||||
return nil
|
|
||||||
|
|
||||||
|
func (b *API) JoinChannel(channel config.ChannelInfo) error {
|
||||||
|
// we could have a `chan config.Message` for each text channel here, instead of hardcoded "api" ?
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *API) Send(msg config.Message) (string, error) {
|
func (b *API) Send(msg config.Message) (string, error) {
|
||||||
@@ -142,9 +135,40 @@ func (b *API) handlePostMessage(c echo.Context) error {
|
|||||||
func (b *API) handleMessages(c echo.Context) error {
|
func (b *API) handleMessages(c echo.Context) error {
|
||||||
b.Lock()
|
b.Lock()
|
||||||
defer b.Unlock()
|
defer b.Unlock()
|
||||||
_ = c.JSONPretty(http.StatusOK, b.Messages.Values(), " ")
|
|
||||||
|
// filter using header skip_before
|
||||||
|
timestamp := time.Time{}
|
||||||
|
hasTimestamp := false
|
||||||
|
timestampStr := c.Request().Header.Get("skip_before")
|
||||||
|
if timestampStr != "" {
|
||||||
|
b.Log.Debugf("received timestamp '%s'", timestampStr)
|
||||||
|
decodedTimestamp, err := time.Parse(time.RFC3339, timestampStr)
|
||||||
|
if err != nil {
|
||||||
|
b.Log.Errorf("failed to parse timestamp '%s'", timestampStr)
|
||||||
|
}
|
||||||
|
timestamp = decodedTimestamp
|
||||||
|
hasTimestamp = true
|
||||||
|
b.Log.Debugf("parsed time '%v'", timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
|
messages := []config.Message{}
|
||||||
|
|
||||||
|
for _, msg := range b.Messages.Values() {
|
||||||
|
msg, ok := msg.(config.Message)
|
||||||
|
if !ok {
|
||||||
|
b.Log.Errorf("failed casting %v", msg)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if hasTimestamp && (timestamp.After(msg.Timestamp) || timestamp.Equal(msg.Timestamp)) {
|
||||||
|
// b.Log.Debugf("skipping mesage with timestamp %v", msg.Timestamp)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
messages = append(messages, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = c.JSONPretty(http.StatusOK, messages, " ")
|
||||||
// not clearing history.. intentionally
|
// not clearing history.. intentionally
|
||||||
//b.Messages = ring.Ring{}
|
// b.Messages = ring.Ring{}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,8 +189,36 @@ func (b *API) handleStream(c echo.Context) error {
|
|||||||
}
|
}
|
||||||
c.Response().Flush()
|
c.Response().Flush()
|
||||||
|
|
||||||
// TODO: currently this skips sending history
|
// filter using header skip_before
|
||||||
// TODO: send history from ringbuffer ?
|
timestamp := time.Time{}
|
||||||
|
hasTimestamp := false
|
||||||
|
timestampStr := c.Request().Header.Get("skip_before")
|
||||||
|
if timestampStr != "" {
|
||||||
|
b.Log.Debugf("received timestamp '%s'", timestampStr)
|
||||||
|
decodedTimestamp, err := time.Parse(time.RFC3339, timestampStr)
|
||||||
|
if err != nil {
|
||||||
|
b.Log.Errorf("failed to parse timestamp '%s'", timestampStr)
|
||||||
|
}
|
||||||
|
timestamp = decodedTimestamp
|
||||||
|
hasTimestamp = true
|
||||||
|
b.Log.Debugf("parsed time '%v'", timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// send messages from history
|
||||||
|
for _, msg := range b.Messages.Values() {
|
||||||
|
msg, ok := msg.(config.Message)
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if hasTimestamp && (timestamp.After(msg.Timestamp) || timestamp.Equal(msg.Timestamp)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := json.NewEncoder(c.Response()).Encode(msg); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.Response().Flush()
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
}
|
||||||
|
|
||||||
member := *b.group.Join()
|
member := *b.group.Join()
|
||||||
defer func() {
|
defer func() {
|
||||||
@@ -174,20 +226,19 @@ func (b *API) handleStream(c echo.Context) error {
|
|||||||
member.Close()
|
member.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
loop: for {
|
loop:
|
||||||
select {
|
for {
|
||||||
// block until channel has message
|
// block until channel has message
|
||||||
case msg := <-member.Read:
|
msg := <-member.Read
|
||||||
messageWrapper, ok := msg.(MessageWrapper)
|
messageWrapper, ok := msg.(MessageWrapper)
|
||||||
if !ok {
|
if !ok {
|
||||||
break loop
|
break loop
|
||||||
}
|
|
||||||
message := messageWrapper.message
|
|
||||||
if err := json.NewEncoder(c.Response()).Encode(message); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
c.Response().Flush()
|
|
||||||
}
|
}
|
||||||
|
message := messageWrapper.message
|
||||||
|
if err := json.NewEncoder(c.Response()).Encode(message); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.Response().Flush()
|
||||||
time.Sleep(200 * time.Millisecond)
|
time.Sleep(200 * time.Millisecond)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@@ -213,14 +264,15 @@ func (b *API) writePump(conn *websocket.Conn, member *bcast.Member) {
|
|||||||
member.Close()
|
member.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
loop: for {
|
loop:
|
||||||
|
for {
|
||||||
select {
|
select {
|
||||||
case msg := <-member.Read:
|
case msg := <-member.Read:
|
||||||
messageWrapper, ok := msg.(MessageWrapper)
|
messageWrapper, ok := msg.(MessageWrapper)
|
||||||
if !ok {
|
if !ok {
|
||||||
break loop
|
break loop
|
||||||
}
|
}
|
||||||
b.Log.Debugf("compare pointer %p == %p", messageWrapper.member, member)
|
b.Log.Debugf("compare pointer %p == %p", messageWrapper.member, member)
|
||||||
if messageWrapper.member == member {
|
if messageWrapper.member == member {
|
||||||
continue loop
|
continue loop
|
||||||
}
|
}
|
||||||
@@ -278,7 +330,7 @@ func (b *API) readPump(conn *websocket.Conn, member *bcast.Member) {
|
|||||||
func (b *API) handleWebsocket(c echo.Context) error {
|
func (b *API) handleWebsocket(c echo.Context) error {
|
||||||
u := websocket.Upgrader{ReadBufferSize: 1024, WriteBufferSize: 1024}
|
u := websocket.Upgrader{ReadBufferSize: 1024, WriteBufferSize: 1024}
|
||||||
conn, err := u.Upgrade(c.Response().Writer, c.Request(), nil)
|
conn, err := u.Upgrade(c.Response().Writer, c.Request(), nil)
|
||||||
//websocket.Upgrade(c.Response().Writer, c.Request(), nil, 1024, 1024)
|
// websocket.Upgrade(c.Response().Writer, c.Request(), nil, 1024, 1024)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -288,8 +340,31 @@ func (b *API) handleWebsocket(c echo.Context) error {
|
|||||||
|
|
||||||
// TODO: maybe send all history as single message as json array ?
|
// TODO: maybe send all history as single message as json array ?
|
||||||
|
|
||||||
|
// filter using header skip_before
|
||||||
|
timestamp := time.Time{}
|
||||||
|
hasTimestamp := false
|
||||||
|
timestampStr := c.Request().Header.Get("skip_before")
|
||||||
|
if timestampStr != "" {
|
||||||
|
b.Log.Debugf("received timestamp '%s'", timestampStr)
|
||||||
|
decodedTimestamp, err := time.Parse(time.RFC3339, timestampStr)
|
||||||
|
if err != nil {
|
||||||
|
b.Log.Errorf("failed to parse timestamp '%s'", timestampStr)
|
||||||
|
}
|
||||||
|
timestamp = decodedTimestamp
|
||||||
|
hasTimestamp = true
|
||||||
|
b.Log.Debugf("parsed time '%v'", timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
// send all messages from history
|
// send all messages from history
|
||||||
for _, msg := range b.Messages.Values() {
|
for _, msg := range b.Messages.Values() {
|
||||||
|
msg, ok := msg.(config.Message)
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if hasTimestamp && (timestamp.After(msg.Timestamp) || timestamp.Equal(msg.Timestamp)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
_ = conn.SetWriteDeadline(time.Now().Add(writeWait))
|
_ = conn.SetWriteDeadline(time.Now().Add(writeWait))
|
||||||
b.Log.Debugf("sending message %v", msg)
|
b.Log.Debugf("sending message %v", msg)
|
||||||
err := conn.WriteJSON(msg)
|
err := conn.WriteJSON(msg)
|
||||||
|
|||||||
Reference in New Issue
Block a user