···204204205205// TODO: this method is necessary because in lexicon there is no way to know if
206206// a type needs to be marshaled with a "$type" field up front, you can only
207207-// know for sure by seeing where the type is used.
207207+// know for sure by seeing where the type is used.
208208func FixRecordReferences(schemas []*Schema, defmap map[string]*ExtDef, prefix string) {
209209 for _, s := range schemas {
210210- if !strings.HasPrefix(s.ID, prefix) {
211211- continue
212212- }
210210+ if !strings.HasPrefix(s.ID, prefix) {
211211+ continue
212212+ }
213213214214 tps := s.AllTypes(prefix, defmap)
215215 for _, t := range tps {
···334334func writeMethods(typename string, ts *TypeSchema, w io.Writer) error {
335335 switch ts.Type {
336336 case "token":
337337- n := ts.id
337337+ n := ts.id
338338 if ts.defName != "main" {
339339 n += "#" + ts.defName
340340 }
···999999 if ts.record {
10001000 fmt.Fprintf(w, "\tLexiconTypeID string `json:\"$type\" cborgen:\"$type,const=%s\"`\n", ts.id)
10011001 } else {
10021002- fmt.Fprintf(w, "\tLexiconTypeID string `json:\"$type,omitempty\"`\n" )
10021002+ fmt.Fprintf(w, "\tLexiconTypeID string `json:\"$type,omitempty\"`\n")
10031003 }
1004100410051005 required := make(map[string]bool)
···10161016 }
1017101710181018 var ptr string
10191019+ var omit string
10191020 if !required[k] {
10201021 if !strings.HasPrefix(tname, "*") && !strings.HasPrefix(tname, "[]") {
10211022 ptr = "*"
10231023+ omit = ",omitempty"
10221024 }
10231025 }
1024102610251025- fmt.Fprintf(w, "\t%s %s%s `json:\"%s\" cborgen:\"%s\"`\n", goname, ptr, tname, k, k)
10271027+ fmt.Fprintf(w, "\t%s %s%s `json:\"%s%s\" cborgen:\"%s\"`\n", goname, ptr, tname, k, omit, k)
10261028 return nil
10271029 }); err != nil {
10281030 return err
···2222 tok.Set("exp", exp.Unix())
23232424 return tok
2525-2625}
27262827func (s *Server) createAuthTokenForUser(ctx context.Context, handle, did string) (*xrpc.AuthInfo, error) {
···53525453func (s *Server) createCrossServerAuthToken(ctx context.Context, otherpds string) (*xrpc.AuthInfo, error) {
5554 accessTok := makeToken(otherpds, "com.atproto.federation", time.Now().Add(24*time.Hour))
5555+5656+ // setting this is a little weird,
5757+ // since the token isnt signed by this key, we dont have a way to validate...
5858+ accessTok.Set("pds", s.signingKey.DID())
56595760 rval := make([]byte, 10)
5861 rand.Read(rval)
+60-7
server/events.go
···11package schemagen
2233-import "fmt"
33+import (
44+ "fmt"
55+ "log"
66+77+ "github.com/gorilla/websocket"
88+ "github.com/labstack/echo/v4"
99+)
410511type EventManager struct {
612 subs []*Subscriber
···4551 }
4652 case opSend:
4753 for _, s := range em.subs {
4848- select {
4949- case s.outgoing <- op.evt:
5050- default:
5151- fmt.Println("event overflow")
5454+ if s.filter(op.evt) {
5555+ fmt.Println("outgoing event: ", op.evt)
5656+ select {
5757+ case s.outgoing <- op.evt:
5858+ default:
5959+ fmt.Println("event overflow")
6060+ }
5261 }
5362 }
5463 default:
···7079)
71807281type Event struct {
7373- Kind string
7474- User string
8282+ Kind string
8383+8484+ // User is the DID of the user this event is about
8585+ User string
8686+7587 Collection string
7688 Rkey string
7789 DID string
7890 CarSlice []byte
9191+9292+ // some private fields for processing metadata
9393+ uid uint
9494+ pdsid uint
7995}
80968197func (em *EventManager) AddEvent(ev *Event) error {
···88104 case <-em.closed:
89105 return fmt.Errorf("event manager shut down")
90106 }
107107+}
108108+109109+func (s *Server) EventsHandler(c echo.Context) error {
110110+ did := c.Request().Header.Get("DID")
111111+ conn, err := websocket.Upgrade(c.Response().Writer, c.Request(), c.Response().Header(), 1<<10, 1<<10)
112112+ if err != nil {
113113+ return err
114114+ }
115115+ ctx := c.Request().Context()
116116+117117+ var peering Peering
118118+ if err := s.db.First(&peering, "did = ?", did).Error; err != nil {
119119+ return err
120120+ }
121121+122122+ evts, cancel, err := s.events.Subscribe(func(evt *Event) bool {
123123+ has, err := s.peerHasFollow(ctx, peering.ID, evt.uid)
124124+ if err != nil {
125125+ log.Println("error checking peer follow relationship: ", err)
126126+ return false
127127+ }
128128+129129+ fmt.Println("follow: ", has)
130130+ return has
131131+ })
132132+ if err != nil {
133133+ return err
134134+ }
135135+ defer cancel()
136136+137137+ for evt := range evts {
138138+ if err := conn.WriteJSON(evt); err != nil {
139139+ return err
140140+ }
141141+ }
142142+143143+ return nil
91144}
9214593146func (em *EventManager) Subscribe(filter func(*Event) bool) (<-chan *Event, func(), error) {