Files
youtube-downloader/realtime.go

88 lines
2.0 KiB
Go

package main
import (
"bytes"
"encoding/json"
"log"
"net/http"
"github.com/r3labs/sse"
)
type RealtimeListener struct {
Url string
Collections []string
Create chan PBEvent
Update chan PBEvent
Delete chan PBEvent
client *sse.Client
}
type Subscription struct {
ClientId string `json:"clientId"`
Subscriptions []string `json:"subscriptions"`
}
func (listener RealtimeListener) handlePbEvent(msg *sse.Event) {
var pbEvent = new(PBEvent)
err := json.Unmarshal(msg.Data, &pbEvent)
if err != nil {
log.Printf("Error unmarshalling event: %v\n", err)
return
}
if pbEvent.ClientId != "" {
listener.doSubscribe(pbEvent.ClientId)
}
if pbEvent.Action != "" {
go listener.shipEvent(*pbEvent)
}
}
func (listener RealtimeListener) shipEvent(event PBEvent) {
switch event.Action {
case "create":
listener.Create <- event
case "update":
listener.Update <- event
case "delete":
listener.Delete <- event
default:
log.Printf("Unknown action: %v\n", event.Action)
}
}
func (listener RealtimeListener) doSubscribe(clientId string) {
subscription := Subscription{
ClientId: clientId,
Subscriptions: listener.Collections,
}
body, err := json.Marshal(subscription)
if err != nil {
log.Printf("Error marshalling subscription body: %v\n", err)
return
}
resp, err := http.Post(POCKETBASE_REALTIME, "application/json", bytes.NewBuffer(body))
if err != nil {
log.Printf("Error posting subscription: %v\n", err)
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusNoContent {
log.Printf("Subscription request failed with status: %v\n", resp.Status)
}
}
func (listener *RealtimeListener) initialize() {
listener.Update = make(chan PBEvent, 32)
listener.Create = make(chan PBEvent, 32)
listener.Delete = make(chan PBEvent, 32)
log.Print("initialized")
listener.client = sse.NewClient(listener.Url)
go listener.client.Subscribe("", listener.handlePbEvent)
}