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}