Monorepo for Tangled

better tap

Signed-off-by: Seongmin Lee <git@boltless.me>

boltless.me 6e7dfa98 fc083c44

verified
+36 -30
+3
tap/readme.md
··· 1 + basic tap client package 2 + 3 + Replace this to official indigo package when <https://github.com/bluesky-social/indigo/pull/1241> gets merged.
+33 -30
tap/tap.go
··· 9 9 "fmt" 10 10 "net/http" 11 11 "net/url" 12 + "time" 12 13 13 14 "github.com/bluesky-social/indigo/atproto/syntax" 14 15 "github.com/gorilla/websocket" ··· 104 105 105 106 url := u.String() 106 107 107 - // var backoff int 108 - // for { 109 - // select { 110 - // case <-ctx.Done(): 111 - // return ctx.Err() 112 - // default: 113 - // } 114 - // 115 - // header := http.Header{ 116 - // "Authorization": []string{""}, 117 - // } 118 - // conn, res, err := websocket.DefaultDialer.DialContext(ctx, url, header) 119 - // if err != nil { 120 - // l.Warn("dialing failed", "url", url, "err", err, "backoff", backoff) 121 - // time.Sleep(time.Duration(5+backoff) * time.Second) 122 - // backoff++ 123 - // 124 - // continue 125 - // } else { 126 - // backoff = 0 127 - // } 128 - // 129 - // l.Info("event subscription response", "code", res.StatusCode) 130 - // } 108 + var backoff int 109 + for { 110 + select { 111 + case <-ctx.Done(): 112 + return ctx.Err() 113 + default: 114 + } 131 115 132 - // TODO: keep websocket connection alive 133 - conn, _, err := websocket.DefaultDialer.DialContext(ctx, url, nil) 134 - if err != nil { 135 - l.Error("failed to connect to tap", "err", err) 136 - return err 116 + header := http.Header{ 117 + "Authorization": []string{""}, 118 + } 119 + conn, res, err := websocket.DefaultDialer.DialContext(ctx, url, header) 120 + if err != nil { 121 + l.Warn("dialing failed", "url", url, "err", err, "backoff", backoff) 122 + time.Sleep(time.Duration(5+backoff) * time.Second) 123 + backoff++ 124 + 125 + continue 126 + } else { 127 + backoff = 0 128 + } 129 + 130 + l.Info("tap event subscription response", "code", res.StatusCode) 131 + 132 + if err = c.handleConnection(ctx, conn, handler); err != nil { 133 + l.Warn("tap connection failed", "err", err, "backoff", backoff) 134 + } 137 135 } 138 - defer conn.Close() 136 + } 137 + 138 + func (c *Client) handleConnection(ctx context.Context, conn *websocket.Conn, handler Handler) error { 139 + l := log.FromContext(ctx) 140 + 139 141 defer func() { 142 + conn.Close() 140 143 l.Warn("closed tap conection") 141 144 }() 142 145 l.Info("established tap conection")