porting all github actions from bluesky-social/indigo to tangled CI

add did:web support

Changed files
+123 -22
api
bgs
cmd
gosky
did
indexer
plc
+3 -3
api/extra.go
··· 6 6 "net/url" 7 7 8 8 comatproto "github.com/bluesky-social/indigo/api/atproto" 9 + "github.com/bluesky-social/indigo/did" 9 10 "github.com/bluesky-social/indigo/xrpc" 10 - did "github.com/whyrusleeping/go-did" 11 11 otel "go.opentelemetry.io/otel" 12 12 ) 13 13 14 - func ResolveDidToHandle(ctx context.Context, xrpcc *xrpc.Client, pls *PLCServer, udid string) (string, string, error) { 14 + func ResolveDidToHandle(ctx context.Context, xrpcc *xrpc.Client, res did.Resolver, udid string) (string, string, error) { 15 15 ctx, span := otel.Tracer("gosky").Start(ctx, "resolveDidToHandle") 16 16 defer span.End() 17 17 18 - doc, err := pls.GetDocument(ctx, udid) 18 + doc, err := res.GetDocument(ctx, udid) 19 19 if err != nil { 20 20 return "", "", err 21 21 }
+3 -3
bgs/bgs.go
··· 18 18 comatproto "github.com/bluesky-social/indigo/api/atproto" 19 19 "github.com/bluesky-social/indigo/blobs" 20 20 "github.com/bluesky-social/indigo/carstore" 21 + "github.com/bluesky-social/indigo/did" 21 22 "github.com/bluesky-social/indigo/events" 22 23 "github.com/bluesky-social/indigo/indexer" 23 24 lexutil "github.com/bluesky-social/indigo/lex/util" 24 25 "github.com/bluesky-social/indigo/models" 25 - "github.com/bluesky-social/indigo/plc" 26 26 "github.com/bluesky-social/indigo/repomgr" 27 27 "github.com/bluesky-social/indigo/util" 28 28 bsutil "github.com/bluesky-social/indigo/util" ··· 45 45 db *gorm.DB 46 46 slurper *Slurper 47 47 events *events.EventManager 48 - didr plc.DidResolver 48 + didr did.Resolver 49 49 50 50 blobs blobs.BlobStore 51 51 ··· 58 58 repoman *repomgr.RepoManager 59 59 } 60 60 61 - func NewBGS(db *gorm.DB, ix *indexer.Indexer, repoman *repomgr.RepoManager, evtman *events.EventManager, didr plc.DidResolver, blobs blobs.BlobStore, ssl bool) (*BGS, error) { 61 + func NewBGS(db *gorm.DB, ix *indexer.Indexer, repoman *repomgr.RepoManager, evtman *events.EventManager, didr did.Resolver, blobs blobs.BlobStore, ssl bool) (*BGS, error) { 62 62 db.AutoMigrate(User{}) 63 63 db.AutoMigrate(AuthToken{}) 64 64 db.AutoMigrate(models.PDS{})
+1 -1
cmd/gosky/admin.go
··· 74 74 return err 75 75 } 76 76 77 - plcc := cliutil.GetPLCClient(cctx) 77 + plcc := cliutil.GetDidResolver(cctx) 78 78 79 79 if cctx.Bool("raw") { 80 80 fmt.Println(string(b))
+1 -1
cmd/gosky/main.go
··· 215 215 Name: "get", 216 216 ArgsUsage: `<did>`, 217 217 Action: func(cctx *cli.Context) error { 218 - s := cliutil.GetPLCClient(cctx) 218 + s := cliutil.GetDidResolver(cctx) 219 219 220 220 doc, err := s.GetDocument(context.TODO(), cctx.Args().First()) 221 221 if err != nil {
+11
cmd/gosky/util/util.go
··· 10 10 "time" 11 11 12 12 "github.com/bluesky-social/indigo/api" 13 + "github.com/bluesky-social/indigo/did" 13 14 "github.com/bluesky-social/indigo/xrpc" 14 15 homedir "github.com/mitchellh/go-homedir" 15 16 "github.com/urfave/cli/v2" ··· 17 18 "gorm.io/driver/sqlite" 18 19 "gorm.io/gorm" 19 20 ) 21 + 22 + func GetDidResolver(cctx *cli.Context) did.Resolver { 23 + mr := did.NewMultiResolver() 24 + mr.AddHandler("plc", &api.PLCServer{ 25 + Host: cctx.String("plc"), 26 + }) 27 + mr.AddHandler("web", &did.WebResolver{}) 28 + 29 + return mr 30 + } 20 31 21 32 func GetPLCClient(cctx *cli.Context) *api.PLCServer { 22 33 return &api.PLCServer{
+7
did/alias.go
··· 1 + package did 2 + 3 + import "github.com/whyrusleeping/go-did" 4 + 5 + type Document = did.Document 6 + 7 + type Service = did.Service
+42
did/multi.go
··· 1 + package did 2 + 3 + import ( 4 + "context" 5 + "fmt" 6 + 7 + "github.com/whyrusleeping/go-did" 8 + ) 9 + 10 + type Resolver interface { 11 + GetDocument(ctx context.Context, didstr string) (*did.Document, error) 12 + } 13 + 14 + type MultiResolver struct { 15 + handlers map[string]Resolver 16 + } 17 + 18 + func NewMultiResolver() *MultiResolver { 19 + return &MultiResolver{ 20 + handlers: make(map[string]Resolver), 21 + } 22 + } 23 + 24 + func (mr *MultiResolver) AddHandler(method string, res Resolver) { 25 + mr.handlers[method] = res 26 + } 27 + 28 + func (mr *MultiResolver) GetDocument(ctx context.Context, didstr string) (*did.Document, error) { 29 + pdid, err := did.ParseDID(didstr) 30 + if err != nil { 31 + return nil, err 32 + } 33 + 34 + method := pdid.Protocol() 35 + 36 + res, ok := mr.handlers[method] 37 + if !ok { 38 + return nil, fmt.Errorf("unknown did method: %q", method) 39 + } 40 + 41 + return res.GetDocument(ctx, didstr) 42 + }
+44
did/web.go
··· 1 + package did 2 + 3 + import ( 4 + "context" 5 + "encoding/json" 6 + "fmt" 7 + "net/http" 8 + "strings" 9 + 10 + "github.com/whyrusleeping/go-did" 11 + ) 12 + 13 + type WebResolver struct { 14 + // TODO: cache? maybe at a different layer 15 + } 16 + 17 + func (wr *WebResolver) GetDocument(ctx context.Context, didstr string) (*Document, error) { 18 + pdid, err := did.ParseDID(didstr) 19 + if err != nil { 20 + return nil, err 21 + } 22 + 23 + val := pdid.Value() 24 + if strings.Contains(val, ":") { 25 + return nil, fmt.Errorf("did:web resolver does not handle ports or documents at sub-paths") 26 + } 27 + 28 + resp, err := http.Get("https://" + val + "/.well-known/did.json") 29 + if err != nil { 30 + return nil, err 31 + } 32 + defer resp.Body.Close() 33 + 34 + if resp.StatusCode != 200 { 35 + return nil, fmt.Errorf("fetch did request failed (status %d): %s", resp.StatusCode, resp.Status) 36 + } 37 + 38 + var out did.Document 39 + if err := json.NewDecoder(resp.Body).Decode(&out); err != nil { 40 + return nil, err 41 + } 42 + 43 + return &out, nil 44 + }
+3 -1
go.mod
··· 34 34 github.com/stretchr/testify v1.8.2 35 35 github.com/urfave/cli/v2 v2.25.1 36 36 github.com/whyrusleeping/cbor-gen v0.0.0-20230331140348-1f892b517e70 37 - github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220 37 + github.com/whyrusleeping/go-did v0.0.0-20230526170049-82aaa4048458 38 38 go.opentelemetry.io/otel v1.14.0 39 39 go.opentelemetry.io/otel/exporters/jaeger v1.14.0 40 40 go.opentelemetry.io/otel/sdk v1.14.0 ··· 128 128 gopkg.in/yaml.v3 v3.0.1 // indirect 129 129 lukechampine.com/blake3 v1.1.7 // indirect 130 130 ) 131 + 132 + replace github.com/whyrusleeping/go-did => ../go-did
-2
go.sum
··· 519 519 github.com/whyrusleeping/cbor-gen v0.0.0-20230331140348-1f892b517e70 h1:iNBzUKTsJc9RqStEVX2VYgVHATTU39IuB7g0e8OPWXU= 520 520 github.com/whyrusleeping/cbor-gen v0.0.0-20230331140348-1f892b517e70/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= 521 521 github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= 522 - github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220 h1:EO/9z3yDvx1van1/0esdcqhalZZQGRj3I1BPTWr5k3A= 523 - github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220/go.mod h1:qPtRyexGM5XMHFIfjH+EiA/A/1n2JakWEdMPC53pJAE= 524 522 github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= 525 523 github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= 526 524 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+3 -3
indexer/indexer.go
··· 10 10 comatproto "github.com/bluesky-social/indigo/api/atproto" 11 11 bsky "github.com/bluesky-social/indigo/api/bsky" 12 12 "github.com/bluesky-social/indigo/carstore" 13 + "github.com/bluesky-social/indigo/did" 13 14 "github.com/bluesky-social/indigo/events" 14 15 lexutil "github.com/bluesky-social/indigo/lex/util" 15 16 "github.com/bluesky-social/indigo/models" 16 17 "github.com/bluesky-social/indigo/notifs" 17 - "github.com/bluesky-social/indigo/plc" 18 18 "github.com/bluesky-social/indigo/repomgr" 19 19 "github.com/bluesky-social/indigo/util" 20 20 "github.com/bluesky-social/indigo/xrpc" ··· 34 34 35 35 notifman notifs.NotificationManager 36 36 events *events.EventManager 37 - didr plc.DidResolver 37 + didr did.Resolver 38 38 39 39 // TODO: i feel like the repomgr doesnt belong here 40 40 repomgr *repomgr.RepoManager ··· 47 47 CreateExternalUser func(context.Context, string) (*models.ActorInfo, error) 48 48 } 49 49 50 - func NewIndexer(db *gorm.DB, notifman notifs.NotificationManager, evtman *events.EventManager, didr plc.DidResolver, repoman *repomgr.RepoManager, crawl, aggregate bool) (*Indexer, error) { 50 + func NewIndexer(db *gorm.DB, notifman notifs.NotificationManager, evtman *events.EventManager, didr did.Resolver, repoman *repomgr.RepoManager, crawl, aggregate bool) (*Indexer, error) { 51 51 db.AutoMigrate(&models.FeedPost{}) 52 52 db.AutoMigrate(&models.ActorInfo{}) 53 53 db.AutoMigrate(&models.FollowRecord{})
+3 -3
plc/caching.go
··· 4 4 "context" 5 5 "time" 6 6 7 + did "github.com/bluesky-social/indigo/did" 7 8 lru "github.com/hashicorp/golang-lru" 8 - "github.com/whyrusleeping/go-did" 9 9 "go.opentelemetry.io/otel" 10 10 "go.opentelemetry.io/otel/attribute" 11 11 ) 12 12 13 13 type CachingDidResolver struct { 14 - res DidResolver 14 + res did.Resolver 15 15 maxAge time.Duration 16 16 cache *lru.ARCCache 17 17 } ··· 21 21 doc *did.Document 22 22 } 23 23 24 - func NewCachingDidResolver(res DidResolver, maxAge time.Duration, size int) *CachingDidResolver { 24 + func NewCachingDidResolver(res did.Resolver, maxAge time.Duration, size int) *CachingDidResolver { 25 25 c, err := lru.NewARC(size) 26 26 if err != nil { 27 27 panic(err)
+2 -5
plc/plc.go
··· 3 3 import ( 4 4 "context" 5 5 6 + didres "github.com/bluesky-social/indigo/did" 6 7 "github.com/whyrusleeping/go-did" 7 8 ) 8 9 9 10 type PLCClient interface { 10 - DidResolver 11 + didres.Resolver 11 12 CreateDID(ctx context.Context, sigkey *did.PrivKey, recovery string, handle string, service string) (string, error) 12 13 UpdateUserHandle(ctx context.Context, didstr string, nhandle string) error 13 14 } 14 - 15 - type DidResolver interface { 16 - GetDocument(ctx context.Context, didstr string) (*did.Document, error) 17 - }