shared.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package p
  2. import (
  3. "net/http"
  4. "strings"
  5. "sync"
  6. "cloud.google.com/go/bigtable"
  7. )
  8. // shared code for the various functions, primarily response formatting.
  9. // client is a global Bigtable client, to avoid initializing a new client for
  10. // every request.
  11. var client *bigtable.Client
  12. var clientOnce sync.Once
  13. var columnFamilies = []string{"MessagePublication", "Signatures", "VAAState", "QuorumState"}
  14. type (
  15. Summary struct {
  16. EmitterChain string
  17. EmitterAddress string
  18. Sequence string
  19. InitiatingTxID string
  20. Payload []byte
  21. GuardiansThatSigned []string
  22. SignedVAABytes []byte
  23. QuorumTime string
  24. }
  25. )
  26. func makeSummary(row bigtable.Row) *Summary {
  27. summary := &Summary{}
  28. if _, ok := row[columnFamilies[0]]; ok {
  29. for _, item := range row[columnFamilies[0]] {
  30. switch item.Column {
  31. case "MessagePublication:InitiatingTxID":
  32. summary.InitiatingTxID = string(item.Value)
  33. case "MessagePublication:Payload":
  34. summary.Payload = item.Value
  35. case "MessagePublication:EmitterChain":
  36. summary.EmitterChain = string(item.Value)
  37. case "MessagePublication:EmitterAddress":
  38. summary.EmitterAddress = string(item.Value)
  39. case "MessagePublication:Sequence":
  40. summary.Sequence = string(item.Value)
  41. }
  42. }
  43. }
  44. if _, ok := row[columnFamilies[1]]; ok {
  45. for _, item := range row[columnFamilies[1]] {
  46. column := strings.Split(item.Column, ":")
  47. summary.GuardiansThatSigned = append(summary.GuardiansThatSigned, column[1])
  48. }
  49. }
  50. if _, ok := row[columnFamilies[3]]; ok {
  51. for _, item := range row[columnFamilies[3]] {
  52. if item.Column == "QuorumState:SignedVAA" {
  53. summary.SignedVAABytes = item.Value
  54. summary.QuorumTime = item.Timestamp.Time().String()
  55. }
  56. }
  57. }
  58. return summary
  59. }
  60. var mux = newMux()
  61. // Entry is the cloud function entry point
  62. func Entry(w http.ResponseWriter, r *http.Request) {
  63. mux.ServeHTTP(w, r)
  64. }
  65. func newMux() *http.ServeMux {
  66. mux := http.NewServeMux()
  67. mux.HandleFunc("/totals", Totals)
  68. mux.HandleFunc("/recent", Recent)
  69. mux.HandleFunc("/transaction", Transaction)
  70. mux.HandleFunc("/readrow", ReadRow)
  71. mux.HandleFunc("/readyz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })
  72. return mux
  73. }