diff --git a/.gitignore b/.gitignore index 1be65ccb1..9d3293985 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,10 @@ coverage/ junit.xml artifacts +# Web bundle outputs +/dist/ + +# Expo .expo/ dist/ *.jks @@ -76,4 +80,4 @@ dist/ web-build/ # Temporary files created by Metro to check the health of the file watcher -.metro-health-check* \ No newline at end of file +.metro-health-check* diff --git a/.prettierignore b/.prettierignore index 2ec214a3b..bd66c8d8d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,4 +2,7 @@ ios android src/third-party src/app.json -public \ No newline at end of file +public +/bskyweb/templates +/dist/ +/.watchmanconfig diff --git a/bskyweb/.gitignore b/bskyweb/.gitignore new file mode 100644 index 000000000..7994736da --- /dev/null +++ b/bskyweb/.gitignore @@ -0,0 +1,3 @@ +/static/bundle.web.js +/bskyweb +.env diff --git a/bskyweb/README.md b/bskyweb/README.md new file mode 100644 index 000000000..86bc16864 --- /dev/null +++ b/bskyweb/README.md @@ -0,0 +1,39 @@ +## Build / Develop + +### SPA Bundle (monolithic static javascript file) + +To build the SPA bundle (`bundle.web.js`), first get a Javascript development +environment set up. Either follow the top-level README, or something quick +like: + + # install nodejs 18 (specifically) + nvm install 18 + nvm use 18 + npm install --global yarn + + # setup tools and deps (in top level of this repo) + yarn install --frozen-lockfile + + # run yarn web dev server, if you wanted + yarn web + +Then build and copy over the big 'ol `bundle.web.js` file: + + # in the top level of this repo + yarn webpack build --config ./web/webpack.config.js -d inline-source-map --color + cp dist/bundle.web.js bskyweb/static/ + +### Golang Daemon + +Install golang. We are generally using v1.19+. + +In this directory (`bskyweb/`): + + # re-build and run daemon + go run ./cmd/bskyweb serve + + # build and output a binary + go build -o bskyweb ./cmd/bskyweb/ + +The easiest way to configure the daemon is to copy `example.env` to `.env` and +fill in auth values there. diff --git a/bskyweb/cmd/bskyweb/main.go b/bskyweb/cmd/bskyweb/main.go new file mode 100644 index 000000000..4b691b686 --- /dev/null +++ b/bskyweb/cmd/bskyweb/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "os" + + logging "github.com/ipfs/go-log" + "github.com/joho/godotenv" + "github.com/urfave/cli/v2" +) + +var log = logging.Logger("bskyweb") + +func init() { + logging.SetAllLoggers(logging.LevelDebug) + //logging.SetAllLoggers(logging.LevelWarn) +} + +func main() { + + // only try dotenv if it exists + if _, err := os.Stat(".env"); err == nil { + err := godotenv.Load() + if err != nil { + log.Fatal("Error loading .env file") + } + } + + run(os.Args) +} + +func run(args []string) { + + app := cli.App{ + Name: "bskyweb", + Usage: "web server for bsky.app web app (SPA)", + } + + app.Flags = []cli.Flag{ + &cli.StringFlag{ + Name: "pds-host", + Usage: "method, hostname, and port of PDS instance", + Value: "http://localhost:4849", + EnvVars: []string{"ATP_PDS_HOST"}, + }, + &cli.StringFlag{ + Name: "handle", + Usage: "for PDS login", + Required: true, + EnvVars: []string{"ATP_AUTH_HANDLE"}, + }, + &cli.StringFlag{ + Name: "password", + Usage: "for PDS login", + Required: true, + EnvVars: []string{"ATP_AUTH_PASSWORD"}, + }, + // TODO: local IP/port to bind on + } + + app.Commands = []*cli.Command{ + &cli.Command{ + Name: "serve", + Usage: "run the server", + Action: serve, + }, + } + app.RunAndExitOnError() +} diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go new file mode 100644 index 000000000..6a8a88884 --- /dev/null +++ b/bskyweb/cmd/bskyweb/server.go @@ -0,0 +1,190 @@ +package main + +import ( + "context" + "errors" + "fmt" + "io" + "net/http" + + comatproto "github.com/bluesky-social/indigo/api/atproto" + appbsky "github.com/bluesky-social/indigo/api/bsky" + cliutil "github.com/bluesky-social/indigo/cmd/gosky/util" + "github.com/bluesky-social/indigo/xrpc" + + "github.com/flosch/pongo2/v6" + "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" + "github.com/urfave/cli/v2" +) + +// TODO: embed templates in executable + +type Renderer struct { + Debug bool +} + +func (r Renderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error { + + var ctx pongo2.Context + + if data != nil { + var ok bool + ctx, ok = data.(pongo2.Context) + + if !ok { + return errors.New("no pongo2.Context data was passed...") + } + } + + var t *pongo2.Template + var err error + + if r.Debug { + t, err = pongo2.FromFile(name) + } else { + t, err = pongo2.FromCache(name) + } + + if err != nil { + return err + } + + return t.ExecuteWriter(ctx, w) +} + +type Server struct { + xrpcc *xrpc.Client +} + +func serve(cctx *cli.Context) error { + + // create a new session + // TODO: does this work with no auth at all? + xrpcc := &xrpc.Client{ + Client: cliutil.NewHttpClient(), + Host: cctx.String("pds-host"), + Auth: &xrpc.AuthInfo{ + Handle: cctx.String("handle"), + }, + } + + auth, err := comatproto.SessionCreate(context.TODO(), xrpcc, &comatproto.SessionCreate_Input{ + Identifier: &xrpcc.Auth.Handle, + Password: cctx.String("password"), + }) + if err != nil { + return err + } + xrpcc.Auth.AccessJwt = auth.AccessJwt + xrpcc.Auth.RefreshJwt = auth.RefreshJwt + xrpcc.Auth.Did = auth.Did + xrpcc.Auth.Handle = auth.Handle + + server := Server{xrpcc} + + e := echo.New() + e.HideBanner = true + e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ + Format: "method=${method} path=${uri} status=${status} latency=${latency_human}\n", + })) + e.Renderer = Renderer{Debug: true} + e.HTTPErrorHandler = customHTTPErrorHandler + + // configure routes + e.File("/robots.txt", "static/robots.txt") + e.Static("/static", "static") + + e.GET("/", server.WebHome) + + // generic routes + e.GET("/contacts", server.WebGeneric) + e.GET("/search", server.WebGeneric) + e.GET("/notifications", server.WebGeneric) + e.GET("/settings", server.WebGeneric) + e.GET("/settings", server.WebGeneric) + + // profile endpoints; only first populates info + e.GET("/profile/:handle", server.WebProfile) + e.GET("/profile/:handle/follows", server.WebGeneric) + e.GET("/profile/:handle/following", server.WebGeneric) + + // post endpoints; only first populates info + e.GET("/profile/:handle/post/:rkey", server.WebPost) + e.GET("/profile/:handle/post/:rkey/upvoted-by", server.WebGeneric) + e.GET("/profile/:handle/post/:rkey/downvoted-by", server.WebGeneric) + e.GET("/profile/:handle/post/:rkey/reposted-by", server.WebGeneric) + + bind := "localhost:8100" + log.Infof("starting server bind=%s", bind) + return e.Start(bind) +} + +func customHTTPErrorHandler(err error, c echo.Context) { + code := http.StatusInternalServerError + if he, ok := err.(*echo.HTTPError); ok { + code = he.Code + } + c.Logger().Error(err) + data := pongo2.Context{ + "statusCode": code, + } + c.Render(code, "templates/error.html", data) +} + +// handler for endpoint that have no specific server-side handling +func (srv *Server) WebGeneric(c echo.Context) error { + data := pongo2.Context{} + return c.Render(http.StatusOK, "templates/base.html", data) +} + +func (srv *Server) WebHome(c echo.Context) error { + data := pongo2.Context{} + return c.Render(http.StatusOK, "templates/home.html", data) +} + +func (srv *Server) WebPost(c echo.Context) error { + data := pongo2.Context{} + handle := c.Param("handle") + rkey := c.Param("rkey") + // sanity check argument + if len(handle) > 4 && len(handle) < 128 && len(rkey) > 0 { + ctx := context.TODO() + // requires two fetches: first fetch profile (!) + pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, handle) + if err != nil { + log.Warnf("failed to fetch handle: %s\t%v", handle, err) + } else { + did := pv.Did + data["did"] = did + + // then fetch the post thread (with extra context) + uri := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", did, rkey) + tpv, err := appbsky.FeedGetPostThread(ctx, srv.xrpcc, 1, uri) + if err != nil { + log.Warnf("failed to fetch post: %s\t%v", uri, err) + } else { + data["postView"] = tpv.Thread.FeedGetPostThread_ThreadViewPost.Post + } + } + + } + return c.Render(http.StatusOK, "templates/post.html", data) +} + +func (srv *Server) WebProfile(c echo.Context) error { + data := pongo2.Context{} + handle := c.Param("handle") + // sanity check argument + if len(handle) > 4 && len(handle) < 128 { + ctx := context.TODO() + pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, handle) + if err != nil { + log.Warnf("failed to fetch handle: %s\t%v", handle, err) + } else { + data["profileView"] = pv + } + } + + return c.Render(http.StatusOK, "templates/profile.html", data) +} diff --git a/bskyweb/example.env b/bskyweb/example.env new file mode 100644 index 000000000..4bcc65e86 --- /dev/null +++ b/bskyweb/example.env @@ -0,0 +1,4 @@ +GOLOG_LOG_LEVEL=info +ATP_PDS_HOST=https://bsky.social +ATP_AUTH_HANDLE=TODO +ATP_AUTH_PASSWORD=TODO diff --git a/bskyweb/go.mod b/bskyweb/go.mod new file mode 100644 index 000000000..dc7af5723 --- /dev/null +++ b/bskyweb/go.mod @@ -0,0 +1,72 @@ +module github.com/bluesky-social/social-app/bskyweb + +go 1.19 + +require ( + github.com/bluesky-social/indigo v0.0.0-20230307000525-294e33e70185 + github.com/ipfs/go-log v1.0.5 + github.com/joho/godotenv v1.5.1 + github.com/labstack/echo/v4 v4.10.2 + github.com/urfave/cli/v2 v2.25.0 +) + +require ( + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/flosch/pongo2/v6 v6.0.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/goccy/go-json v0.10.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/ipfs/go-cid v0.3.2 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.2.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/labstack/gommon v0.4.0 // indirect + github.com/lestrrat-go/blackmagic v1.0.1 // indirect + github.com/lestrrat-go/httpcc v1.0.1 // indirect + github.com/lestrrat-go/httprc v1.0.4 // indirect + github.com/lestrrat-go/iter v1.0.2 // indirect + github.com/lestrrat-go/jwx/v2 v2.0.8 // indirect + github.com/lestrrat-go/option v1.0.1 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-sqlite3 v1.14.16 // indirect + github.com/minio/sha256-simd v1.0.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect + github.com/multiformats/go-multibase v0.1.1 // indirect + github.com/multiformats/go-multihash v0.2.1 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa // indirect + github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + go.opentelemetry.io/otel v1.11.2 // indirect + go.opentelemetry.io/otel/trace v1.11.2 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + go.uber.org/zap v1.24.0 // indirect + golang.org/x/crypto v0.6.0 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect + golang.org/x/time v0.3.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + gorm.io/driver/postgres v1.4.6 // indirect + gorm.io/driver/sqlite v1.4.4 // indirect + gorm.io/gorm v1.24.3 // indirect + lukechampine.com/blake3 v1.1.7 // indirect +) diff --git a/bskyweb/go.sum b/bskyweb/go.sum new file mode 100644 index 000000000..df9d87dc6 --- /dev/null +++ b/bskyweb/go.sum @@ -0,0 +1,287 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bluesky-social/indigo v0.0.0-20230306194356-5958f14d5152 h1:7fHM+tQHJN5lsMU8FvV4bNuWpD0Dd+pAUSuoLYdcYIQ= +github.com/bluesky-social/indigo v0.0.0-20230306194356-5958f14d5152/go.mod h1:xy2hI4NMC6fgUefSJcCst6E0yo9Xbfd97aF27lgHyHE= +github.com/bluesky-social/indigo v0.0.0-20230307000525-294e33e70185 h1:WnaOpRFWE8Tmw0IeXEEthsqBZtNG6/niokmWANv/aEU= +github.com/bluesky-social/indigo v0.0.0-20230307000525-294e33e70185/go.mod h1:xy2hI4NMC6fgUefSJcCst6E0yo9Xbfd97aF27lgHyHE= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU= +github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= +github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc= +github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= +github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.2.0 h1:NdPpngX0Y6z6XDFKqmFQaE+bCtkqzvQIOt1wvBlAqs8= +github.com/jackc/pgx/v5 v5.2.0/go.mod h1:Ptn7zmohNsWEsdxRawMzk3gaKma2obW+NWTnKa0S4nk= +github.com/jackc/puddle/v2 v2.1.2/go.mod h1:2lpufsF5mRHO6SuZkm0fNYxM6SWHfvyFj62KwNzgels= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M= +github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k= +github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= +github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/httprc v1.0.4 h1:bAZymwoZQb+Oq8MEbyipag7iSq6YIga8Wj6GOiJGdI8= +github.com/lestrrat-go/httprc v1.0.4/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= +github.com/lestrrat-go/jwx/v2 v2.0.8 h1:jCFT8oc0hEDVjgUgsBy1F9cbjsjAVZSXNi7JaU9HR/Q= +github.com/lestrrat-go/jwx/v2 v2.0.8/go.mod h1:zLxnyv9rTlEvOUHbc48FAfIL8iYu2hHvIRaTFGc8mT0= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= +github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= +github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= +github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= +github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= +github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= +github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/urfave/cli/v2 v2.25.0 h1:ykdZKuQey2zq0yin/l7JOm9Mh+pg72ngYMeB0ABn6q8= +github.com/urfave/cli/v2 v2.25.0/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa h1:EyA027ZAkuaCLoxVX4r1TZMPy1d31fM6hbfQ4OU4I5o= +github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220 h1:EO/9z3yDvx1van1/0esdcqhalZZQGRj3I1BPTWr5k3A= +github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220/go.mod h1:qPtRyexGM5XMHFIfjH+EiA/A/1n2JakWEdMPC53pJAE= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/otel v1.11.2 h1:YBZcQlsVekzFsFbjygXMOXSs6pialIZxcjfO/mBDmR0= +go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI= +go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZM/+y0= +go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.4.6 h1:1FPESNXqIKG5JmraaH2bfCVlMQ7paLoCreFxDtqzwdc= +gorm.io/driver/postgres v1.4.6/go.mod h1:UJChCNLFKeBqQRE+HrkFUbKbq9idPXmTOk2u4Wok8S4= +gorm.io/driver/sqlite v1.4.4 h1:gIufGoR0dQzjkyqDyYSCvsYR6fba1Gw5YKDqKeChxFc= +gorm.io/driver/sqlite v1.4.4/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= +gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.24.2/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.24.3 h1:WL2ifUmzR/SLp85CSURAfybcHnGZ+yLSGSxgYXlFBHg= +gorm.io/gorm v1.24.3/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= +lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= diff --git a/bskyweb/static/apple-touch-icon.png b/bskyweb/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5ebb6787c999108d56d1b2f2aa4a5f2275ac5e37 GIT binary patch literal 14742 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 literal 0 HcmV?d00001 diff --git a/bskyweb/static/favicon-16x16.png b/bskyweb/static/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..4267562b808197d5b00b58f3ffdedde4b689b3c2 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7nLS+`LoEE4h8S`kauAr~ znXdTa@fud{jRGv(2OAO;mAJb6KQwFIxNmharl>PLL?mg_?z=PZ?wu)Mo4xSuwS-IU zk?ahmw*TLL4EZm4V)Zw_9g3=KWe!P`l`giYpY&fLwBnN=<4$G6Et{2g@tesDsPY}? zvWV-LSUfc(zG`o4!Cn=Eq&I60z5AV~vww+-8dHUA@YcC)-#Ri`6wFST7b~VQI?UBP z_U8I0Ys35%3tpOhvQ7G^f8Y~)!-A6Vf+P=Ug_CHvJE`*K V@_u*pU|?Wi@O1TaS?83{1OOS_e`^2$ literal 0 HcmV?d00001 diff --git a/bskyweb/static/favicon-32x32.png b/bskyweb/static/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..869f6df5fc6bdd2c78f2ac91679fb6814f999485 GIT binary patch literal 769 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!Cp=voLn7SQhVRV^aTNJ? z?x=|thh59mt-TMtJvLl+Di9Uyb#!tO5o~?npD(#vVPA`YK(@C0A+1{~XDZU(&E5Tc z-dtnj@|&8QZqBu=zyDKx$>z8EkComnIILR{!}_Ok-=YfHf4@FP`wQ;dE??*S|Hn`L zW!8r{`94nlr*iE;Zar)Ck25jrKOZjsbCcVzsfcR}cl^FDPj1dI{`XK~dBg+mziKR} z^&d*d-)ZY;H{*apnF2}VvG9j!;jSyANoi9X!T5Z+7f-?nuvEv zWYsV49q*g$Z@txZj1ErwIxn&Qfm6z@%&FX4JQE}hjz=UWx$P?9;E!zdoojl>rNTrb zKxvv*)Wv+ujS|d^i;u5qXl;Bd6+7culEw>8f2r7j=Iv$qJ7#WB7P%l6UFx`dNyOil zl(YIJ9B;H(QbgCVE*IJ3SJkF+aPuT?k?U%TuL6&nw%9s1dPFoFe#N`59|wVvq6EYR*NG<|*i0k8ARYPr*$$BWLNdh$nm~)O+W164QsIPo3e$=4;Xn!Z!DEi1>8;y2_Ji%KcnffBD=9 zzh>(wfA4KQU+wdp)8BkbHmhp9yJ5~U;Ry|ozwUW`z4+1BJ=0{@dL3J2zvlTlS;o7H e^S-_QS+9J7zr7+tu!n(xfx*+&&t;ucLK6T@oM(;z literal 0 HcmV?d00001 diff --git a/bskyweb/static/favicon.ico b/bskyweb/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b4290a797a9f7ae4d14373ff1608be81d5940725 GIT binary patch literal 15406 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 aVb=d72Jin73{tQ(19I;u9t{CXLjVA0l*gw4 literal 0 HcmV?d00001 diff --git a/bskyweb/static/favicon.png b/bskyweb/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..61cf7c943b6ac083ab0752f283391e37b39c1221 GIT binary patch literal 6405 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 Q6Eu|X>FVdQ&MBb@0K66k1ONa4 literal 0 HcmV?d00001 diff --git a/bskyweb/static/robots.txt b/bskyweb/static/robots.txt new file mode 100644 index 000000000..d3475984e --- /dev/null +++ b/bskyweb/static/robots.txt @@ -0,0 +1 @@ +# hello friends! diff --git a/bskyweb/static/social-card-default.png b/bskyweb/static/social-card-default.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb93c799c9859bcd1afac7b0310d48e51d7efc8 GIT binary patch literal 23527 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 + + + + + + {%- block head_title -%}Bluesky{%- endblock -%} + + + {% block head_bundle -%}{%- endblock %} + + + + {% block head_page_meta -%} + + + + + + + + + {%- endblock %} + + + + + {% block head_metadata %}{% endblock %} + + +{%- block body_all %} +
+
+{% endblock -%} + + diff --git a/bskyweb/templates/error.html b/bskyweb/templates/error.html new file mode 100644 index 000000000..e40d8c4ab --- /dev/null +++ b/bskyweb/templates/error.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} + +{% block head_title %}Error {{ statusCode }} - Bluesky{% endblock %} + +{# don't include the bundle on error pages #} +{% block head_bundle %}{% endblock %} + +{% block body_all %} + {% if statusCode == 404 %} +

404: Not Found

+ {% else %} +

{{ statusCode }}: Server Error

+

Sorry about that! Our Status Page might have more context. + {% endif %} +{% endblock %} diff --git a/bskyweb/templates/home.html b/bskyweb/templates/home.html new file mode 100644 index 000000000..631f281c0 --- /dev/null +++ b/bskyweb/templates/home.html @@ -0,0 +1,7 @@ +{% extends "base.html" %} + +{% block head_title %}Bluesky{% endblock %} + +{% block noscript_extra %} +

This is the home page. +{% endblock %} diff --git a/bskyweb/templates/post.html b/bskyweb/templates/post.html new file mode 100644 index 000000000..a24f64ab5 --- /dev/null +++ b/bskyweb/templates/post.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} + +{% block head_page_meta -%} + +{%- if postView -%} + + + {%- if postView.Author.DisplayName -%} + + + {%- else -%} + + + {%- endif -%} + {%- if postView.Record.Text -%} + + + {%- endif -%} +{%- endif -%} +{%- endblock %} + +{% block noscript_extra -%} +

{{ postView.Author.DisplayName }} / {{ postView.Author.Handle }} +

{{ postView.Record.Text }} +{%- endblock %} diff --git a/bskyweb/templates/profile.html b/bskyweb/templates/profile.html new file mode 100644 index 000000000..260f211a6 --- /dev/null +++ b/bskyweb/templates/profile.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} + +{% block head_page_meta -%} + +{%- if profileView -%} + + + {%- if profileView.DisplayName -%} + + + {%- else -%} + + + {%- endif -%} + + {%- if profileView.Avatar -%} + + {%- endif -%} +{%- endif -%} +{%- endblock %} + +{% block noscript_extra -%} +

{{ profileView.DisplayName }} / {{ profileView.Handle }} +

{{ profileView.Description }} +{%- endblock %}