From fbb81c868cbe386b226c2982ad5e766a55e74a59 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sun, 24 Jul 2022 19:52:25 -0300 Subject: [PATCH] bring in and refactor rss bridge. --- go.mod | 26 ++++ go.sum | 276 ++++++++++++++++++++++++++++++++++++++ rss-bridge/.gitignore | 2 + rss-bridge/Makefile | 2 + rss-bridge/README.md | 26 ++++ rss-bridge/feed.go | 157 ++++++++++++++++++++++ rss-bridge/handlers.go | 130 ++++++++++++++++++ rss-bridge/helpers.go | 20 +++ rss-bridge/main.go | 183 +++++++++++++++++++++++++ rss-bridge/screenshot.png | Bin 0 -> 62292 bytes 10 files changed, 822 insertions(+) create mode 100644 rss-bridge/.gitignore create mode 100644 rss-bridge/Makefile create mode 100644 rss-bridge/README.md create mode 100644 rss-bridge/feed.go create mode 100644 rss-bridge/handlers.go create mode 100644 rss-bridge/helpers.go create mode 100644 rss-bridge/main.go create mode 100644 rss-bridge/screenshot.png diff --git a/go.mod b/go.mod index 20335fe..9c2aa92 100644 --- a/go.mod +++ b/go.mod @@ -3,19 +3,28 @@ module github.com/fiatjaf/relayer go 1.18 require ( + github.com/PuerkitoBio/goquery v1.8.0 + github.com/cockroachdb/pebble v0.0.0-20220723153705-3fc374e4dc66 github.com/fiatjaf/go-nostr v0.7.3 github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.4.2 + github.com/grokify/html-strip-tags-go v0.0.1 github.com/jb55/lnsocket/go v0.0.0-20220315220004-e1e6b88a0bfc github.com/jmoiron/sqlx v1.3.1 github.com/kelseyhightower/envconfig v1.4.0 + github.com/mmcdole/gofeed v1.1.3 + github.com/rif/cache2go v1.0.0 github.com/rs/cors v1.7.0 github.com/rs/zerolog v1.20.0 + github.com/stevelacy/daz v0.1.4 github.com/tidwall/gjson v1.14.1 ) require ( + github.com/DataDog/zstd v1.4.5 // indirect + github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect github.com/aead/siphash v1.0.1 // indirect + github.com/andybalholm/cascadia v1.3.1 // indirect github.com/btcsuite/btcd v0.23.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/btcsuite/btcd/btcutil v1.1.1 // indirect @@ -30,12 +39,23 @@ require ( github.com/btcsuite/btcwallet/wtxmgr v1.5.0 // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/cockroachdb/errors v1.8.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect + github.com/cockroachdb/redact v1.0.8 // indirect + github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/decred/dcrd/lru v1.0.0 // indirect github.com/go-errors/errors v1.0.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/json-iterator/go v1.1.11 // indirect github.com/kkdai/bstream v1.0.0 // indirect + github.com/klauspost/compress v1.13.6 // indirect + github.com/kr/pretty v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf // indirect github.com/lightninglabs/neutrino v0.14.2 // indirect github.com/lightningnetwork/lnd v0.15.0-beta // indirect @@ -45,13 +65,19 @@ require ( github.com/lightningnetwork/lnd/tlv v1.0.3 // indirect github.com/lightningnetwork/lnd/tor v1.0.1 // indirect github.com/miekg/dns v1.1.43 // indirect + github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/valyala/fastjson v1.6.3 // indirect golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect + golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 // indirect golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect + golang.org/x/text v0.3.7 // indirect ) replace github.com/jb55/lnsocket/go => /home/fiatjaf/comp/lnsocket/go diff --git a/go.sum b/go.sum index d4895f4..4686ca7 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,33 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= +github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/andybalholm/brotli v1.0.3 h1:fpcw+r1N1h0Poc1F/pHbW40cUm/lMEQslZtCkBQ0UnM= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= +github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= @@ -57,13 +80,35 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3 github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= +github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= +github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20220723153705-3fc374e4dc66 h1:zB1MHj8vfz6QDMSkO8ASmNZW8JRqDMqEukXBRVIPzjM= +github.com/cockroachdb/pebble v0.0.0-20220723153705-3fc374e4dc66/go.mod h1:890yq1fUb9b6dGNwssgeUO5vQV9qfXnCPxAJhBQfXw0= +github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= +github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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= @@ -74,24 +119,57 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dvyukov/go-fuzz v0.0.0-20210602112143-b1f3d6f4ef4e h1:qTP1telKJHlToHlwPQNmVg4yfMDMHe4Z3SYmzkrvA2M= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fergusstrange/embedded-postgres v1.10.0 h1:YnwF6xAQYmKLAXXrrRx4rHDLih47YJwVPvg8jeKfdNg= github.com/fiatjaf/go-nostr v0.7.3 h1:Z95U2qTTj3a41+ybopYjfKZ+bMpNFM43ARA7B4IOYVs= github.com/fiatjaf/go-nostr v0.7.3/go.mod h1:pbJCdZzBKPB8wgQDipS5POnOV1afhcFzJUIwJ5qKSrU= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -99,20 +177,41 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0= +github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= github.com/jackc/pgconn v1.10.0 h1:4EYhlDVEMsJ30nNj0mmgwIUXoq7e9sMJrVC2ED6QlCU= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= @@ -129,19 +228,44 @@ github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXL github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= +github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= +github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +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/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/kkdai/bstream v0.0.0-20181106074824-b3251f7901ec/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/kkdai/bstream v1.0.0 h1:Se5gHwgp2VT2uHfDrkbbgbgEvV9cimLELwrPJctSjg8= github.com/kkdai/bstream v1.0.0/go.mod h1:FDnDOHt5Yx4p3FaHcioFT0QjDOtgUpvjeZqAs+NVZZA= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 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 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.3 h1:v9QZf2Sn6AmjXtQeFpdoq/eaNtYP6IN+7lcrygsIAtg= github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf h1:HZKvJUHlcXI/f/O0Avg7t8sqkPo78HFzjmeYFl6DPnc= @@ -168,43 +292,95 @@ github.com/lightningnetwork/lnd/tlv v1.0.3/go.mod h1:dzR/aZetBri+ZY/fHbwV06fNn/3 github.com/lightningnetwork/lnd/tor v1.0.1 h1:A11FrpU0Y//g+fA827W4VnjOeoIvExONdchlLX8wYkA= github.com/lightningnetwork/lnd/tor v1.0.1/go.mod h1:RDtaAdwfAm+ONuPYwUhNIH1RAvKPv+75lHPOegUcz64= github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796 h1:sjOGyegMIhvgfq5oaue6Td+hxZuf3tDC8lAPrFldqFw= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= +github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= github.com/mholt/archiver/v3 v3.5.0 h1:nE8gZIrw66cu4osS/U7UW7YDuGMHssxKutU8IfWxwWE= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mmcdole/gofeed v1.1.3 h1:pdrvMb18jMSLidGp8j0pLvc9IGziX4vbmvVqmLH6z8o= +github.com/mmcdole/gofeed v1.1.3/go.mod h1:QQO3maftbOu+hiVOGOZDRLymqGQCos4zxbA4j89gMrE= +github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf h1:sWGE2v+hO0Nd4yFU/S/mDBM5plIU8v/Qhfz41hkDIAI= +github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf/go.mod h1:pasqhqstspkosTneA62Nc+2p9SOBBYAPbnmRRWPQ0V8= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nwaples/rardecode v1.1.2 h1:Cj0yZY6T1Zx1R7AhTbyGSALm44/Mmq+BAPc4B/p/d3M= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pierrec/lz4/v4 v4.1.8 h1:ieHkV+i2BRzngO4Wd/3HGowuZStgq6QkPsD1eolNAO4= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/rif/cache2go v1.0.0 h1:DhvZcxXvsuD9ExQ6ZO6f/sOE66OaAQIwB8Mfumap4w4= +github.com/rif/cache2go v1.0.0/go.mod h1:reDqW0mGufW34CGJ1tvjMobI1BY3dCTxA0ZWdbvm06s= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.20.0 h1:38k9hgtUBdxFwE34yS8rTHmHBa4eN16E4DJlv177LNs= github.com/rs/zerolog v1.20.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stevelacy/daz v0.1.4 h1:ugmff/D7D764wZjXSgSryEINE/bi+Xddllw3JQQGbWk= +github.com/stevelacy/daz v0.1.4/go.mod h1:AbK6DzjiIL15r4bQtcFvOBAvDGMXoh+uIG26NRUugt0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= @@ -220,11 +396,29 @@ github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhso github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= +github.com/urfave/cli v1.22.3/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +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.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.5-0.20200615073812-232d8fc87f50/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= @@ -250,53 +444,99 @@ go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 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-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E= golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +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.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/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-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +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-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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 h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/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-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= @@ -311,21 +551,49 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/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-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +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.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2 h1:CCXrcPKiGGotvnN6jfUsKk4rRqm7q09/YbKb5xCEvtM= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced h1:c5geK1iMU3cDKtFrCVQIcjR3W+JOZMuhIyICMCTbtus= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -336,7 +604,12 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= 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-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -347,5 +620,8 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= diff --git a/rss-bridge/.gitignore b/rss-bridge/.gitignore new file mode 100644 index 0000000..30969ff --- /dev/null +++ b/rss-bridge/.gitignore @@ -0,0 +1,2 @@ +relayer-rss-bridge +db diff --git a/rss-bridge/Makefile b/rss-bridge/Makefile new file mode 100644 index 0000000..3ccf3c0 --- /dev/null +++ b/rss-bridge/Makefile @@ -0,0 +1,2 @@ +relayer-rss-bridge: $(shell find . -name "*.go") + CC=$$(which musl-gcc) go build -ldflags="-s -w -linkmode external -extldflags '-static'" -o ./relayer-rss-bridge diff --git a/rss-bridge/README.md b/rss-bridge/README.md new file mode 100644 index 0000000..2414526 --- /dev/null +++ b/rss-bridge/README.md @@ -0,0 +1,26 @@ +rss-bridge, a relay that creates virtual nostr profiles for each rss feed +========================================================================= + + - a nostr relay implementation based on relayer. + - doesn't accept any events, only emits them. + - does so by manually reading and parsing rss feeds. + +![](screenshot.png) + +running +------- + +grab a binary from the releases page and run it with the following environment variable: + + SECRET=just-a-random-string-to-be-used-when-generating-the-virtual-private-keys + +it will create a local database file to store the currently known rss feed urls. + +compiling +--------- + +if you know Go you already know this: + + go install github.com/fiatjaf/relayer/rss-bridge + +or something like that. diff --git a/rss-bridge/feed.go b/rss-bridge/feed.go new file mode 100644 index 0000000..87e51df --- /dev/null +++ b/rss-bridge/feed.go @@ -0,0 +1,157 @@ +package main + +import ( + "crypto/hmac" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "net/http" + "strings" + "time" + + "github.com/PuerkitoBio/goquery" + "github.com/fiatjaf/go-nostr" + strip "github.com/grokify/html-strip-tags-go" + "github.com/mmcdole/gofeed" + "github.com/rif/cache2go" +) + +var ( + fp = gofeed.NewParser() + feedCache = cache2go.New(512, time.Minute*19) + client = &http.Client{ + Timeout: 5 * time.Second, + } +) + +type Entity struct { + PrivateKey string + URL string +} + +var types = []string{ + "rss+xml", + "atom+xml", + "feed+json", + "text/xml", + "application/xml", +} + +func getFeedURL(url string) string { + resp, err := client.Get(url) + if err != nil || resp.StatusCode >= 300 { + return "" + } + + ct := resp.Header.Get("Content-Type") + for _, typ := range types { + if strings.Contains(ct, typ) { + return url + } + } + + if strings.Contains(ct, "text/html") { + doc, err := goquery.NewDocumentFromReader(resp.Body) + if err != nil { + return "" + } + + for _, typ := range types { + href, _ := doc.Find(fmt.Sprintf("link[type*='%s']", typ)).Attr("href") + if href == "" { + continue + } + if !strings.HasPrefix(href, "http") { + href, _ = urljoin(url, href) + } + return href + } + } + + return "" +} + +func parseFeed(url string) (*gofeed.Feed, error) { + if feed, ok := feedCache.Get(url); ok { + return feed.(*gofeed.Feed), nil + } + + feed, err := fp.ParseURL(url) + if err != nil { + return nil, err + } + + // cleanup a little so we don't store too much junk + for i := range feed.Items { + feed.Items[i].Content = "" + } + feedCache.Set(url, feed) + + return feed, nil +} + +func feedToSetMetadata(pubkey string, feed *gofeed.Feed) nostr.Event { + metadata := map[string]string{ + "name": feed.Title, + "about": feed.Description + "\n\n" + feed.Link, + } + if feed.Image != nil { + metadata["picture"] = feed.Image.URL + } + content, _ := json.Marshal(metadata) + + createdAt := time.Now() + if feed.PublishedParsed != nil { + createdAt = *feed.PublishedParsed + } + + evt := nostr.Event{ + PubKey: pubkey, + CreatedAt: createdAt, + Kind: nostr.KindSetMetadata, + Tags: nostr.Tags{}, + Content: string(content), + } + evt.ID = string(evt.Serialize()) + + return evt +} + +func itemToTextNote(pubkey string, item *gofeed.Item) nostr.Event { + content := "" + if item.Title != "" { + content = "**" + item.Title + "**\n\n" + } + content += strip.StripTags(item.Description) + if len(content) > 250 { + content += content[0:249] + "…" + } + content += "\n\n" + item.Link + + createdAt := time.Now() + if item.UpdatedParsed != nil { + createdAt = *item.UpdatedParsed + } + if item.PublishedParsed != nil { + createdAt = *item.PublishedParsed + } + + evt := nostr.Event{ + PubKey: pubkey, + CreatedAt: createdAt, + Kind: nostr.KindTextNote, + Tags: nostr.Tags{}, + Content: content, + } + evt.ID = string(evt.Serialize()) + + return evt +} + +func privateKeyFromFeed(url string) string { + m := hmac.New(sha256.New, []byte(relay.Secret)) + m.Write([]byte(url)) + r := m.Sum(nil) + return hex.EncodeToString(r) +} diff --git a/rss-bridge/handlers.go b/rss-bridge/handlers.go new file mode 100644 index 0000000..8d28edd --- /dev/null +++ b/rss-bridge/handlers.go @@ -0,0 +1,130 @@ +package main + +import ( + "encoding/json" + "fmt" + "net/http" + + "github.com/fiatjaf/go-nostr" + "github.com/fiatjaf/relayer" + . "github.com/stevelacy/daz" +) + +var head = H("head", + H("meta", Attr{"charset": "utf-8"}), + H("meta", Attr{ + "name": "viewport", + "content": "width=device-width, initial-scale=1.0", + }), + H("title", "rsslay"), +) + +func handleWebpage(w http.ResponseWriter, r *http.Request) { + items := make([]HTML, 0, 200) + iter := relay.db.NewIter(nil) + for iter.First(); iter.Valid(); iter.Next() { + pubkey := string(iter.Key()) + var entity Entity + if err := json.Unmarshal(iter.Value(), &entity); err != nil { + continue + } + items = append(items, H("tr", + H("td", + H("code", + pubkey), + ), + H("td", + H("a", Attr{ + "href": entity.URL, + }, entity.URL), + ), + )) + } + + body := H("body", + H("h1", "rsslay"), + H("p", "rsslay turns RSS or Atom feeds into ", + H("a", Attr{ + "href": "https://github.com/fiatjaf/nostr", + }, "Nostr"), + " profiles.", + ), + H("h2", "How to use"), + H("ol", + H("li", "Get the blog URL or RSS or Atom feed URL and paste below;"), + H("li", "Click the button to get its corresponding public key"), + H("li", "Add this relay to your Nostr client"), + H("li", "Follow the feed's public key from your Nostr client."), + ), + H("form", Attr{ + "action": "/create", + "method": "GET", + "class": "my-4", + }, + H("label", + H("input", Attr{ + "name": "url", + "type": "url", + "placeholder": "https://.../feed", + }), + ), + H("button", "Get Public Key"), + ), + + H("h2", "Some of the existing feeds"), + H("table", items), + H("h2", "Source Code"), + H("p", "You can find it at ", + H("a", Attr{"href": "https://github.com/fiatjaf/rsslay"}, + "https://github.com/fiatjaf/rsslay"), + ), + ) + + w.Header().Set("content-type", "text/html") + w.Write([]byte( + H("html", + head, + body, + )())) +} + +func handleCreateFeed(w http.ResponseWriter, r *http.Request) { + url := r.URL.Query().Get("url") + + feedurl := getFeedURL(url) + if feedurl == "" { + w.WriteHeader(400) + fmt.Fprint(w, "couldn't find a feed url") + return + } + + if _, err := parseFeed(feedurl); err != nil { + w.WriteHeader(400) + fmt.Fprint(w, "bad feed: "+err.Error()) + return + } + + sk := privateKeyFromFeed(feedurl) + pubkey, err := nostr.GetPublicKey(sk) + if err != nil { + w.WriteHeader(500) + fmt.Fprint(w, "bad private key: "+err.Error()) + return + } + + j, _ := json.Marshal(Entity{ + PrivateKey: sk, + URL: feedurl, + }) + + if err := relay.db.Set([]byte(pubkey), j, nil); err != nil { + w.WriteHeader(500) + fmt.Fprint(w, "failure: "+err.Error()) + return + } + + relayer.Log.Info().Str("url", feedurl).Str("pubkey", pubkey).Msg("saved feed") + + fmt.Fprintf(w, "url : %s\npubkey: %s", feedurl, pubkey) + return +} diff --git a/rss-bridge/helpers.go b/rss-bridge/helpers.go new file mode 100644 index 0000000..5584f5b --- /dev/null +++ b/rss-bridge/helpers.go @@ -0,0 +1,20 @@ +package main + +import ( + "net/url" + "path" +) + +func urljoin(baseUrl string, elem ...string) (result string, err error) { + u, err := url.Parse(baseUrl) + if err != nil { + return + } + + if len(elem) > 0 { + elem = append([]string{u.Path}, elem...) + u.Path = path.Join(elem...) + } + + return u.String(), nil +} diff --git a/rss-bridge/main.go b/rss-bridge/main.go new file mode 100644 index 0000000..5d2cc9b --- /dev/null +++ b/rss-bridge/main.go @@ -0,0 +1,183 @@ +package main + +import ( + "encoding/json" + "errors" + "fmt" + "sync" + "time" + + "github.com/cockroachdb/pebble" + "github.com/fiatjaf/go-nostr" + "github.com/fiatjaf/relayer" + "github.com/kelseyhightower/envconfig" +) + +var relay = &Relay{ + updates: make(chan nostr.Event), +} + +type Relay struct { + Secret string `envconfig:"SECRET" required:"true"` + + updates chan nostr.Event + lastEmitted sync.Map + db *pebble.DB +} + +func (relay *Relay) Name() string { + return "relayer-rss-bridge" +} + +func (relay *Relay) Init() error { + err := envconfig.Process("", relay) + if err != nil { + return fmt.Errorf("couldn't process envconfig: %w", err) + } + + if db, err := pebble.Open("db", nil); err != nil { + relayer.Log.Fatal().Err(err).Str("path", "db").Msg("failed to open db") + } else { + relay.db = db + } + + relayer.Router.Path("/").HandlerFunc(handleWebpage) + relayer.Router.Path("/create").HandlerFunc(handleCreateFeed) + + go func() { + time.Sleep(20 * time.Minute) + + filters := relayer.GetListeningFilters() + relayer.Log.Info().Int("filters active", len(filters)). + Msg("checking for updates") + + for _, filter := range filters { + if filter.Kinds == nil || filter.Kinds.Contains(nostr.KindTextNote) { + for _, pubkey := range filter.Authors { + if val, closer, err := relay.db.Get([]byte(pubkey)); err == nil { + defer closer.Close() + + var entity Entity + if err := json.Unmarshal(val, &entity); err != nil { + relayer.Log.Error().Err(err).Str("key", pubkey). + Str("val", string(val)). + Msg("got invalid json from db") + continue + } + + feed, err := parseFeed(entity.URL) + if err != nil { + relayer.Log.Warn().Err(err).Str("url", entity.URL). + Msg("failed to parse feed") + continue + } + + for _, item := range feed.Items { + evt := itemToTextNote(pubkey, item) + last, ok := relay.lastEmitted.Load(entity.URL) + if !ok || time.Unix(last.(int64), 0).Before(evt.CreatedAt) { + evt.Sign(entity.PrivateKey) + relay.updates <- evt + relay.lastEmitted.Store(entity.URL, last) + } + } + } + } + } + } + }() + + return nil +} + +func (relay *Relay) AcceptEvent(_ *nostr.Event) bool { + return false +} + +func (relay *Relay) Storage() relayer.Storage { + return store{relay.db} +} + +type store struct { + db *pebble.DB +} + +func (b store) Init() error { return nil } +func (b store) SaveEvent(_ *nostr.Event) error { return errors.New("we don't accept any events") } +func (b store) DeleteEvent(_, _ string) error { return errors.New("we can't delete any events") } + +func (b store) QueryEvents(filter *nostr.Filter) ([]nostr.Event, error) { + var evts []nostr.Event + + if filter.IDs != nil || len(filter.Tags) > 0 { + return evts, nil + } + + for _, pubkey := range filter.Authors { + if val, closer, err := relay.db.Get([]byte(pubkey)); err == nil { + defer closer.Close() + + var entity Entity + if err := json.Unmarshal(val, &entity); err != nil { + relayer.Log.Error().Err(err).Str("key", pubkey).Str("val", string(val)). + Msg("got invalid json from db") + continue + } + + feed, err := parseFeed(entity.URL) + if err != nil { + relayer.Log.Warn().Err(err).Str("url", entity.URL). + Msg("failed to parse feed") + continue + } + + if filter.Kinds == nil || filter.Kinds.Contains(nostr.KindSetMetadata) { + evt := feedToSetMetadata(pubkey, feed) + + if filter.Since != nil && evt.CreatedAt.Before(*filter.Since) { + continue + } + if filter.Until != nil && evt.CreatedAt.After(*filter.Until) { + continue + } + + evt.Sign(entity.PrivateKey) + evts = append(evts, evt) + } + + if filter.Kinds == nil || filter.Kinds.Contains(nostr.KindTextNote) { + var last uint32 = 0 + for _, item := range feed.Items { + evt := itemToTextNote(pubkey, item) + + if filter.Since != nil && evt.CreatedAt.Before(*filter.Since) { + continue + } + if filter.Until != nil && evt.CreatedAt.After(*filter.Until) { + continue + } + + evt.Sign(entity.PrivateKey) + + if evt.CreatedAt.After(time.Unix(int64(last), 0)) { + last = uint32(evt.CreatedAt.Unix()) + } + + evts = append(evts, evt) + } + + relay.lastEmitted.Store(entity.URL, last) + } + } + } + + return evts, nil +} + +func (relay *Relay) InjectEvents() chan nostr.Event { + return relay.updates +} + +func main() { + relayer.Start(relay) +} diff --git a/rss-bridge/screenshot.png b/rss-bridge/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b41d6adfc41d3833f3d44012e101994872278c GIT binary patch literal 62292 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

^9_p$ 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 NvZA^|$z#i~{{eyIz6$^V literal 0 HcmV?d00001