websocket ready, wip invoice watcher
parent
b1e4ee4196
commit
bcd3160cfd
@ -0,0 +1,80 @@
|
||||
package ln
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"git.sp4ke.com/sp4ke/bit4sat/db"
|
||||
"github.com/mediocregopher/radix/v3"
|
||||
)
|
||||
|
||||
type Invoice struct {
|
||||
Id string `json:"id"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
Description string `json:"description"`
|
||||
ExpiresAt time.Time `json:"expires_at"`
|
||||
Msatoshi int `json:"msatoshi"`
|
||||
Payreq string `json:"payreq"`
|
||||
RHash string `json:"r_hash"`
|
||||
Status string `json:"status"`
|
||||
UploadId string `json:"upload_id"`
|
||||
}
|
||||
|
||||
type InvoiceWatcher struct{}
|
||||
|
||||
func (w *InvoiceWatcher) Run() {
|
||||
watchedKey := "watch_invoices"
|
||||
|
||||
for {
|
||||
var invoiceBlob []byte
|
||||
|
||||
popTimeout := "0" //block until ready
|
||||
err := db.DB.Redis.Do(radix.Cmd(&invoiceBlob,
|
||||
"BLPOP",
|
||||
watchedKey,
|
||||
popTimeout))
|
||||
|
||||
if err != nil {
|
||||
log.Println("error in InvoiceWatcher ", err)
|
||||
continue
|
||||
}
|
||||
|
||||
invoice := Invoice{}
|
||||
err = json.Unmarshal(invoiceBlob, &invoice)
|
||||
if err != nil {
|
||||
log.Println("error unmarshaling in InvoiceWatcher ", err)
|
||||
}
|
||||
|
||||
go func() {
|
||||
|
||||
log.Println("Starting goroutine to watch invoice")
|
||||
time.Sleep(10 * time.Second)
|
||||
//charge := ln.NewCharge()
|
||||
|
||||
// Blocking function
|
||||
//rawInvoice, err := charge.PollInvoice(invoice.Id)
|
||||
//if err != nil {
|
||||
//return err
|
||||
//}
|
||||
|
||||
//err = SetUploadStatus(uploadId, UpWaitingStorage)
|
||||
//if err != nil {
|
||||
//log.Printf("Error setting upload status", err)
|
||||
//}
|
||||
|
||||
// Set paid upload invoice id
|
||||
//err = SetPaidUploadInvoice(uploadId, invoice)
|
||||
//if err != nil {
|
||||
//return err
|
||||
//}
|
||||
|
||||
}()
|
||||
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
}
|
||||
|
||||
func NewInvoiceWatcher() *InvoiceWatcher {
|
||||
return &InvoiceWatcher{}
|
||||
}
|
@ -1,108 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
const (
|
||||
// Time allowed to write message to peer
|
||||
writeWait = 10 * time.Second
|
||||
|
||||
// Time allowed to read the next pong message from the client.
|
||||
pongWait = 5 * time.Second
|
||||
|
||||
// Send pings to client with this period. Must be less than pongWait.
|
||||
pingPeriod = (pongWait * 9) / 10
|
||||
//pingPeriod = 5 * time.Second
|
||||
|
||||
// Maximum message size
|
||||
maxMessageSize = 512
|
||||
)
|
||||
|
||||
var upgrader = websocket.Upgrader{
|
||||
ReadBufferSize: 1024,
|
||||
WriteBufferSize: 1024,
|
||||
CheckOrigin: func(r *http.Request) bool {
|
||||
return true
|
||||
},
|
||||
}
|
||||
|
||||
var (
|
||||
conn *websocket.Conn
|
||||
)
|
||||
|
||||
var (
|
||||
newline = []byte{'\n'}
|
||||
space = []byte{' '}
|
||||
)
|
||||
|
||||
func reader() {
|
||||
defer conn.Close()
|
||||
conn.SetReadLimit(maxMessageSize)
|
||||
conn.SetReadDeadline(time.Now().Add(pongWait))
|
||||
conn.SetPongHandler(func(string) error {
|
||||
//log.Println("pong")
|
||||
conn.SetReadDeadline(time.Now().Add(pongWait))
|
||||
return nil
|
||||
})
|
||||
|
||||
for {
|
||||
_, message, err := conn.ReadMessage()
|
||||
if err != nil {
|
||||
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway,
|
||||
websocket.CloseAbnormalClosure) {
|
||||
log.Printf("error: %v", err)
|
||||
}
|
||||
break
|
||||
}
|
||||
message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1))
|
||||
}
|
||||
}
|
||||
|
||||
func writer() {
|
||||
pingTicker := time.NewTicker(pingPeriod)
|
||||
defer func() {
|
||||
log.Println("quit ws server")
|
||||
|
||||
pingTicker.Stop()
|
||||
conn.Close()
|
||||
}()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-pingTicker.C:
|
||||
//log.Println("ping")
|
||||
|
||||
conn.SetWriteDeadline(time.Now().Add(writeWait))
|
||||
if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func serveWebsocket(c *gin.Context) {
|
||||
var err error
|
||||
log.Println("websocket request")
|
||||
|
||||
conn, err = upgrader.Upgrade(c.Writer, c.Request, nil)
|
||||
if err != nil {
|
||||
if _, ok := err.(websocket.HandshakeError); !ok {
|
||||
log.Printf("handshake error: %s", err)
|
||||
}
|
||||
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
go writer()
|
||||
reader()
|
||||
}
|
@ -0,0 +1,142 @@
|
||||
package ws
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
const (
|
||||
// Time allowed to write message to peer
|
||||
writeWait = 10 * time.Second
|
||||
|
||||
// Time allowed to read the next pong message from the client.
|
||||
pongWait = 5 * time.Second
|
||||
|
||||
// Send pings to client with this period. Must be less than pongWait.
|
||||
pingPeriod = (pongWait * 9) / 10
|
||||
//pingPeriod = 5 * time.Second
|
||||
|
||||
// Maximum message size
|
||||
maxMessageSize = 512
|
||||
)
|
||||
|
||||
var upgrader = websocket.Upgrader{
|
||||
ReadBufferSize: 1024,
|
||||
WriteBufferSize: 1024,
|
||||
CheckOrigin: func(r *http.Request) bool {
|
||||
return true
|
||||
},
|
||||
}
|
||||
|
||||
var C *Client
|
||||
|
||||
// Interface to talk to websocket
|
||||
type Client struct {
|
||||
|
||||
// websocket connection
|
||||
conn *websocket.Conn
|
||||
|
||||
// Buffered channel of outbound messages
|
||||
send chan []byte
|
||||
}
|
||||
|
||||
func (c *Client) readPump() {
|
||||
defer c.conn.Close()
|
||||
c.conn.SetReadLimit(maxMessageSize)
|
||||
c.conn.SetReadDeadline(time.Now().Add(pongWait))
|
||||
c.conn.SetPongHandler(func(string) error {
|
||||
//log.Println("pong")
|
||||
c.conn.SetReadDeadline(time.Now().Add(pongWait))
|
||||
return nil
|
||||
})
|
||||
|
||||
for {
|
||||
_, message, err := c.conn.ReadMessage()
|
||||
if err != nil {
|
||||
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway,
|
||||
websocket.CloseAbnormalClosure) {
|
||||
log.Printf("error: %v", err)
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
recvData := make(map[string]interface{})
|
||||
json.Unmarshal(message, &recvData)
|
||||
log.Println(recvData)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) writePump() {
|
||||
//testTicker := time.NewTicker(5 * time.Second)
|
||||
pingTicker := time.NewTicker(pingPeriod)
|
||||
defer func() {
|
||||
log.Println("quit ws server")
|
||||
|
||||
pingTicker.Stop()
|
||||
c.conn.Close()
|
||||
}()
|
||||
|
||||
for {
|
||||
select {
|
||||
//case <-testTicker.C:
|
||||
//c.conn.SetWriteDeadline(time.Now().Add(writeWait))
|
||||
|
||||
//msg := gin.H{
|
||||
//"msg": "hello",
|
||||
//"data": "from server",
|
||||
//}
|
||||
|
||||
//w, err := c.conn.NextWriter(websocket.TextMessage)
|
||||
//if err != nil {
|
||||
//log.Println(err)
|
||||
//return
|
||||
//}
|
||||
|
||||
//enc := json.NewEncoder(w)
|
||||
//err = enc.Encode(msg)
|
||||
//if err != nil {
|
||||
//log.Println(err)
|
||||
//return
|
||||
//}
|
||||
|
||||
//if err = w.Close(); err != nil {
|
||||
//log.Println(err)
|
||||
//return
|
||||
//}
|
||||
|
||||
case <-pingTicker.C:
|
||||
//log.Println("ping")
|
||||
|
||||
c.conn.SetWriteDeadline(time.Now().Add(writeWait))
|
||||
if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Serve(c *gin.Context) {
|
||||
log.Println("websocket request")
|
||||
|
||||
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
|
||||
if err != nil {
|
||||
if _, ok := err.(websocket.HandshakeError); !ok {
|
||||
log.Printf("handshake error: %s", err)
|
||||
}
|
||||
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
C = &Client{conn: conn, send: make(chan []byte, 256)}
|
||||
|
||||
go C.writePump()
|
||||
go C.readPump()
|
||||
}
|
Loading…
Reference in New Issue