diff --git a/controllers/invoicestream.ctrl.go b/controllers/invoicestream.ctrl.go index 6dd6476..4532c2f 100644 --- a/controllers/invoicestream.ctrl.go +++ b/controllers/invoicestream.ctrl.go @@ -2,6 +2,7 @@ package controllers import ( "net/http" + "time" "github.com/getAlby/lndhub.go/common" "github.com/getAlby/lndhub.go/db/models" @@ -16,6 +17,11 @@ type InvoiceStreamController struct { svc *service.LndhubService } +type InvoiceEventWrapper struct { + Type string `json:"type"` + Invoice *IncomingInvoice `json:"invoice, omitempty"` +} + func NewInvoiceStreamController(svc *service.LndhubService) *InvoiceStreamController { return &InvoiceStreamController{svc: svc} } @@ -31,6 +37,7 @@ func (controller *InvoiceStreamController) StreamInvoices(c echo.Context) error ctx := c.Request().Context() upgrader := websocket.Upgrader{} upgrader.CheckOrigin = func(r *http.Request) bool { return true } + ticker := time.NewTicker(30 * time.Second) ws, err := upgrader.Upgrade(c.Response(), c.Request(), nil) if err != nil { return err @@ -41,18 +48,26 @@ SocketLoop: select { case <-ctx.Done(): break SocketLoop + case <-ticker.C: + err := ws.WriteJSON(&InvoiceEventWrapper{Type: "keepalive"}) + if err != nil { + controller.svc.Logger.Error(err) + break SocketLoop + } case invoice := <-invoiceChan: err := ws.WriteJSON( - &IncomingInvoice{ - PaymentHash: invoice.RHash, - PaymentRequest: invoice.PaymentRequest, - Description: invoice.Memo, - PayReq: invoice.PaymentRequest, - Timestamp: invoice.CreatedAt.Unix(), - Type: common.InvoiceTypeUser, - Amount: invoice.Amount, - IsPaid: invoice.State == common.InvoiceStateSettled, - }) + &InvoiceEventWrapper{ + Type: "invoice", + Invoice: &IncomingInvoice{ + PaymentHash: invoice.RHash, + PaymentRequest: invoice.PaymentRequest, + Description: invoice.Memo, + PayReq: invoice.PaymentRequest, + Timestamp: invoice.CreatedAt.Unix(), + Type: common.InvoiceTypeUser, + Amount: invoice.Amount, + IsPaid: invoice.State == common.InvoiceStateSettled, + }}) if err != nil { controller.svc.Logger.Error(err) break SocketLoop