Lasa is a stateless proxy that generates a RSS or an Atom feed from a Standard.site publication. lasa.anhgelus.world
rss atom atprotocol standard-site atproto
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(cli): lasad simple http server

+139 -16
+1 -1
README.md
··· 1 1 # Lasa 2 2 3 - Lasa is stateless proxy that generates an RSS/Atom feed from a [Standard.site](https://Standard.site) publication. 3 + Lasa is stateless proxy that generates a RSS or an Atom feed from a [Standard.site](https://standard.site) publication. 4 4 5 5 ## Usage 6 6
+1 -1
cmd/internal/print.go
··· 28 28 fmt.Fprintln(w) 29 29 fmt.Fprintln(w, "Options:") 30 30 flags.VisitAll(func(f *flag.Flag) { 31 - fmt.Fprintln(w, "\t-", f.Name, "\t", f.Usage, "\t(default:", f.DefValue, ")") 31 + fmt.Fprintln(w, "\t-"+f.Name, "\t", f.Usage, "\t(default:", f.DefValue+")") 32 32 }) 33 33 } 34 34 fmt.Fprintln(w)
+12 -8
cmd/lasa/main.go
··· 12 12 ) 13 13 14 14 var ( 15 - help bool 15 + flags *flag.FlagSet 16 + help bool 16 17 ) 17 18 18 19 func init() { 19 - flag.BoolVar(&help, "h", false, "show the help") 20 + flags = flag.NewFlagSet("default", flag.PanicOnError) 21 + flags.BoolVar(&help, "h", false, "show the help") 20 22 } 21 23 22 24 var commands = []internal.Command{ ··· 27 29 var client xrpc.Client 28 30 29 31 func main() { 30 - flag.Parse() 31 - args := flag.Args() 32 + flags.Parse(os.Args[1:]) 33 + args := flags.Args() 32 34 if len(args) == 0 { 33 - handleHelp(nil) 35 + handleHelp() 34 36 return 35 37 } 36 38 client = lasa.NewClient(http.DefaultClient, net.DefaultResolver, nil, 0) ··· 41 43 } 42 44 for _, c := range commands { 43 45 if c.Name == command { 46 + flags.Parse(next) 47 + next = flags.Args() 44 48 c.Callback(next) 45 49 return 46 50 } 47 51 } 48 - handleHelp(next) 52 + handleHelp() 49 53 os.Exit(1) 50 54 } 51 55 52 - func handleHelp([]string) { 56 + func handleHelp() { 53 57 internal.Usage( 54 58 `lasa <command>`, 55 59 `Lasa is a CLI tool.`, 56 60 commands, 57 - nil, 61 + flags, 58 62 []string{ 59 63 "lasa publication anhgelus.world\t-\tdisplay publications of anhgelus.world", 60 64 },
+2 -2
cmd/lasa/publication.go
··· 17 17 `lasa publication <identifier> [rkey]`, 18 18 `List publications of identifier (can be a DID or an Handle) or display a specific publication referenced by its rkey`, 19 19 nil, 20 - nil, 20 + flags, 21 21 []string{ 22 22 "lasa publication anhgelus.world\t-\tdisplay publications of anhgelus.world", 23 23 "lasa publication did:plc:123\t-\tdisplay publications of did:plc:123", ··· 30 30 } 31 31 32 32 func handlePublication(args []string) { 33 - if len(args) == 0 { 33 + if len(args) == 0 || help { 34 34 handlePublicationUsage() 35 35 return 36 36 }
+2 -2
cmd/lasa/rss.go
··· 16 16 `lasa rss <identifier> <rkey>`, 17 17 `Generate the RSS for the given publication.`, 18 18 nil, 19 - nil, 19 + flags, 20 20 []string{ 21 21 "lasa publication did:web:example.org fooBar\t-\tgenerate RSS publication of did:web:example.org referenced by fooBar", 22 22 }, ··· 27 27 } 28 28 29 29 func handleRSS(args []string) { 30 - if len(args) != 2 { 30 + if len(args) != 2 || help { 31 31 handleRSSUsage() 32 32 return 33 33 }
+61
cmd/lasad/main.go
··· 1 + package main 2 + 3 + import ( 4 + "flag" 5 + "os" 6 + 7 + "tangled.org/anhgelus.world/lasa/cmd/internal" 8 + "tangled.org/anhgelus.world/lasa/cmd/lasad/config" 9 + ) 10 + 11 + var ( 12 + flags *flag.FlagSet 13 + help = false 14 + configPath = config.DefaultPath 15 + ) 16 + 17 + func init() { 18 + flags = flag.NewFlagSet("default", flag.PanicOnError) 19 + flags.BoolVar(&help, "h", help, "display the help") 20 + flags.StringVar(&configPath, "c", configPath, "path to the config") 21 + } 22 + 23 + var commands = []internal.Command{ 24 + {Name: "run", Usage: "run the daemon", Callback: handleRun}, 25 + } 26 + 27 + func main() { 28 + flags.Parse(os.Args[1:]) 29 + args := flags.Args() 30 + command := "run" 31 + if len(args) > 0 { 32 + command = args[0] 33 + } 34 + var next []string 35 + if len(args) > 1 { 36 + next = args[1:] 37 + } 38 + for _, c := range commands { 39 + if c.Name == command { 40 + flags.Parse(next) 41 + next = flags.Args() 42 + c.Callback(next) 43 + return 44 + } 45 + } 46 + handleHelp(args) 47 + os.Exit(1) 48 + } 49 + 50 + func handleHelp([]string) { 51 + internal.Usage( 52 + `lasad <command>`, 53 + `Daemon running Lasa.`, 54 + nil, 55 + flags, 56 + []string{ 57 + "lasad\t-\trun the daemon", 58 + "lasad -c /foo/bar.toml\t-\trun the daemon with the config at /foo/bar.toml", 59 + }, 60 + ) 61 + }
+52
cmd/lasad/run.go
··· 1 + package main 2 + 3 + import ( 4 + "context" 5 + "net/http" 6 + "os" 7 + "os/signal" 8 + "syscall" 9 + 10 + "tangled.org/anhgelus.world/lasa/cmd/internal" 11 + ) 12 + 13 + func handleRunHelp() { 14 + internal.Usage( 15 + `lasad run`, 16 + `Run the daemon`, 17 + nil, 18 + flags, 19 + []string{ 20 + "lased run\t-\trun the daemon with the default config file", 21 + }, 22 + ) 23 + if !help { 24 + os.Exit(1) 25 + } 26 + } 27 + 28 + func handleRun(args []string) { 29 + if len(args) != 0 || help { 30 + handleRunHelp() 31 + return 32 + } 33 + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGINT, syscall.SIGTERM) 34 + defer cancel() 35 + 36 + mux := http.NewServeMux() 37 + 38 + ch := make(chan error, 1) 39 + 40 + go func() { 41 + ch <- http.ListenAndServe(":8000", mux) 42 + }() 43 + var err error 44 + select { 45 + case <-ctx.Done(): 46 + err = ctx.Err() 47 + case err = <-ch: 48 + } 49 + if err != nil { 50 + panic(err) 51 + } 52 + }
config/config.go cmd/lasad/config/config.go
+8 -2
justfile
··· 1 - build: build-lasa 1 + builder := 'go build -ldflags "-s -w"' 2 + 3 + build: build-lasa build-lasad 2 4 3 5 build-lasa: 4 - go build -ldflags "-s -w" -o build/lasa ./cmd/lasa/ 6 + {{builder}} -o build/lasa ./cmd/lasa/ 7 + 8 + build-lasad: 9 + {{builder}} -o build/lasad ./cmd/lasad/ 10 +