jestream: allow caller to optionally waitForDid
This is handy because the knotserver only subscribes to specific dids, and we don't want jestream to run without (which defaults to all dids). The oppsite is true for the appview which wants to see all dids.
Also adds some nil checks to ensure it doesn't break when event is not a Commit.
Anirudh Oppiliappan 2 weeks ago 4 files (+25, -9)
MODIFIED
appview/state/state.go
MODIFIED
appview/state/state.go
@@ -59,13 +59,18 @@ pgs := pages.NewPages()resolver := appview.NewResolver()- jc, err := jetstream.NewJetstreamClient("appview", []string{tangled.GraphFollowNSID}, nil, db)+ jc, err := jetstream.NewJetstreamClient("appview", []string{tangled.GraphFollowNSID}, nil, db, false)if err != nil {return nil, fmt.Errorf("failed to create jetstream client: %w", err)}err = jc.StartJetstream(context.Background(), func(ctx context.Context, e *models.Event) error {+ if e.Kind != models.EventKindCommit {+ return nil+ }+did := e.Did- raw := e.Commit.Record+ fmt.Println("got event", e.Commit.Collection, e.Commit.RKey, e.Commit.Record)+ raw := json.RawMessage(e.Commit.Record)switch e.Commit.Collection {case tangled.GraphFollowNSID:
MODIFIED
cmd/knotserver/main.go
MODIFIED
cmd/knotserver/main.go
@@ -45,7 +45,7 @@jc, err := jetstream.NewJetstreamClient("knotserver", []string{tangled.PublicKeyNSID,tangled.KnotMemberNSID,- }, nil, db)+ }, nil, db, true)if err != nil {l.Error("failed to setup jetstream", "error", err)}
MODIFIED
jetstream/jetstream.go
MODIFIED
jetstream/jetstream.go
@@ -24,6 +24,7 @@ ident stringdb DBreconnectCh chan struct{}+ waitForDid boolmu sync.RWMutex}@@ -41,7 +42,7 @@ j.mu.Unlock()j.reconnectCh <- struct{}{}}-func NewJetstreamClient(ident string, collections []string, cfg *client.ClientConfig, db DB) (*JetstreamClient, error) {+func NewJetstreamClient(ident string, collections []string, cfg *client.ClientConfig, db DB, waitForDid bool) (*JetstreamClient, error) {if cfg == nil {cfg = client.DefaultClientConfig()cfg.WebsocketURL = "wss://jetstream1.us-west.bsky.network/subscribe"@@ -49,9 +50,13 @@ cfg.WantedCollections = collections}return &JetstreamClient{- cfg: cfg,- ident: ident,- db: db,+ cfg: cfg,+ ident: ident,+ db: db,++ // This will make the goroutine in StartJetstream wait until+ // cfg.WantedDids has been populated, typically using UpdateDids.+ waitForDid: waitForDid,reconnectCh: make(chan struct{}, 1),}, nil}@@ -82,9 +87,12 @@ j.client = clientgo func() {lastTimeUs := j.getLastTimeUs(ctx)- for len(j.cfg.WantedDids) == 0 {- time.Sleep(time.Second)+ if j.waitForDid {+ for len(j.cfg.WantedDids) == 0 {+ time.Sleep(time.Second)+ }}+ logger.Info("done waiting for did")j.connectAndRead(ctx, &lastTimeUs)}()
MODIFIED
knotserver/jetstream.go
MODIFIED
knotserver/jetstream.go
@@ -108,6 +108,9 @@ }func (h *Handle) processMessages(ctx context.Context, event *models.Event) error {did := event.Did+ if event.Kind != models.EventKindCommit {+ return nil+ }raw := json.RawMessage(event.Commit.Record)