Feed generator written in Golang
1package main
2
3import (
4 "fmt"
5 "log"
6 "os"
7 "os/signal"
8 "time"
9)
10
11func main() {
12 logger := log.Default()
13
14 logger.Println("Opening DB connection")
15 db, err := NewDatabaseConnection()
16 if err != nil {
17 log.Fatalf("failed to open db: ", err)
18 }
19
20 logger.Println("Ensuring migrations")
21 err = db.EnsureMigrations()
22 if err != nil {
23 log.Fatalf("failed to ensure migrations: ", err)
24 }
25
26 logger.Println("Preparing post chan -> db consumer")
27 chanPosts := make(chan *DatabasePost, 1000)
28 go db.StreamPostsFromChannel(chanPosts)
29
30 logger.Println("Installing interrupt handler")
31 interrupt := make(chan os.Signal, 1)
32 signal.Notify(interrupt, os.Interrupt)
33
34 /*
35 logger.Println("Creating JS2 firehose websocket consumer")
36 consumerJS2 := MakeConsumer(URL_RELAY_JETSTREAM2)
37 defer consumerJS2.Close()
38
39 logger.Println("Starting JS2 firehose consumer")
40 go consumerJS2.StartConsumer(
41 streamPostsToDbCurry(chanPosts),
42 )
43
44 consumer := consumerJS2
45 */
46
47 logger.Println("Creating Blacksky firehose websocket consumer")
48 consumerBlksky := MakeConsumer(URL_RELAY_BLACKSKY)
49 defer consumerBlksky.Close()
50
51 logger.Println("Initiating message handlers")
52 go func() {
53 decoder := CBORDecoder(chanPosts)
54 for {
55 select {
56 case data := <-*consumerBlksky.MessagesChan:
57 decoder(data)
58 }
59 }
60 }()
61
62 go func() {
63 decoder := CBORDecoder(chanPosts)
64 for {
65 select {
66 case data := <-*consumerBlksky.MessagesChan:
67 decoder(data)
68 }
69 }
70 }()
71
72 logger.Println("Starting Blacksky firehose consumer")
73 go consumerBlksky.StartConsumer(
74 // CBORDecoder(chanPosts),
75 )
76
77 consumer := consumerBlksky
78
79 logger.Println("Creating HTTP server")
80 server := NewHTTPServer(db)
81
82 logger.Println("Registering routes")
83 server.RegisterRoutes()
84
85 logger.Println("Starting HTTP server")
86 go server.StartListener()
87
88 logger.Println("System is now running until it isn't")
89 for {
90 select {
91 case <-*consumer.DoneSignal:
92 logger.Println("ws goroutine closed, goodbye")
93 return
94 case <-*server.DoneSignal:
95 logger.Println("http server closed, goodbye")
96 err := consumer.CloseWithTimeout(time.Second)
97 if err != nil {
98 logger.Println("failed to close ws: ", err)
99 }
100
101 return
102 case <-interrupt:
103 fmt.Println()
104 err := consumer.CloseWithTimeout(time.Second)
105 if err != nil {
106 logger.Println("failed to close ws: ", err)
107 }
108
109 return
110 }
111 }
112}