diff --git a/blastr.go b/blastr.go index ec4219f..ea59dcb 100644 --- a/blastr.go +++ b/blastr.go @@ -3,22 +3,23 @@ package main import ( "context" "log" + "time" "github.com/nbd-wtf/go-nostr" ) func blast(ev *nostr.Event) { ctx := context.Background() - for _, relay := range config.BlastrRelays { - go blastRoutine(ctx, relay, ev) + for _, url := range config.BlastrRelays { + ctx, cancel := context.WithTimeout(ctx, time.Second*5) + relay, err := pool.EnsureRelay(url) + if err != nil { + cancel() + log.Println("error connecting to relay", relay, err) + return + } + relay.Publish(ctx, *ev) + log.Println("🔫 blasted to", relay) + cancel() } } - -func blastRoutine(ctx context.Context, relay string, ev *nostr.Event) { - connect, err := nostr.RelayConnect(ctx, relay) - if err != nil { - log.Println("error connecting to relay", relay, err) - } - connect.Publish(ctx, *ev) - log.Println("🔫 blasted to", relay) -} diff --git a/go.mod b/go.mod index 9809921..cb3923a 100644 --- a/go.mod +++ b/go.mod @@ -5,18 +5,19 @@ go 1.23.0 toolchain go1.23.1 require ( + github.com/aws/aws-sdk-go-v2 v1.31.0 + github.com/aws/aws-sdk-go-v2/config v1.27.36 + github.com/aws/aws-sdk-go-v2/service/s3 v1.63.0 github.com/fiatjaf/eventstore v0.9.0 github.com/fiatjaf/khatru v0.8.1 github.com/joho/godotenv v1.5.1 - github.com/nbd-wtf/go-nostr v0.37.2 + github.com/nbd-wtf/go-nostr v0.37.3 + github.com/puzpuzpuz/xsync/v3 v3.4.0 ) require ( - github.com/PowerDNS/lmdb-go v1.9.2 // indirect github.com/andybalholm/brotli v1.0.5 // indirect - github.com/aws/aws-sdk-go-v2 v1.31.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 // indirect - github.com/aws/aws-sdk-go-v2/config v1.27.36 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.34 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 // indirect @@ -27,7 +28,6 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.63.0 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.23.0 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.31.0 // indirect @@ -51,12 +51,10 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/flatbuffers v23.5.26+incompatible // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/compress v1.17.8 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/puzpuzpuz/xsync/v3 v3.4.0 // indirect github.com/rs/cors v1.7.0 // indirect github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect github.com/tidwall/gjson v1.17.3 // indirect diff --git a/go.sum b/go.sum index da8df5f..f4d8db2 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/PowerDNS/lmdb-go v1.9.2 h1:Cmgerh9y3ZKBZGz1irxSShhfmFyRUh+Zdk4cZk7ZJvU= -github.com/PowerDNS/lmdb-go v1.9.2/go.mod h1:TE0l+EZK8Z1B4dx070ZxkWTlp8RG1mjN0/+FkFRQMtU= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= @@ -66,7 +64,6 @@ github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= 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 v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -87,6 +84,7 @@ github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8Bzu github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -97,8 +95,6 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fasthttp/websocket v1.5.7 h1:0a6o2OfeATvtGgoMKleURhLT6JqWPg7fYfWnH4KHau4= github.com/fasthttp/websocket v1.5.7/go.mod h1:bC4fxSono9czeXHQUVKxsC0sNjbm7lPJR04GDFqClfU= -github.com/fiatjaf/eventstore v0.8.2 h1:nCa3UuJNV5Y5t+SDoPQe7PBmKJ6dhm9TQ/WyR4SCbIM= -github.com/fiatjaf/eventstore v0.8.2/go.mod h1:ck3RxufitHUBjID1RLcRxfX+NMywQzMsdfNpSt6m+9U= github.com/fiatjaf/eventstore v0.9.0 h1:WsGDVAaRaVaV/J8PdrQDGfzChrL13q+lTO4C44rhu3E= github.com/fiatjaf/eventstore v0.9.0/go.mod h1:JrAce5h0wi79+Sw4gsEq5kz0NtUxbVkOZ7lAo7ay6R8= github.com/fiatjaf/khatru v0.8.1 h1:BWAZqwuT0272ZlyzPkuqAA0eGBOs5G3u0Dn1tlWrm6Q= @@ -144,13 +140,12 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -163,12 +158,8 @@ github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0N github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/nbd-wtf/go-nostr v0.35.0 h1:oINIBr5XE1kowkaz7NXC5vLvj2jUWH6xlzJjChpgV6Q= -github.com/nbd-wtf/go-nostr v0.35.0/go.mod h1:NZQkxl96ggbO8rvDpVjcsojJqKTPwqhP4i82O7K5DJs= -github.com/nbd-wtf/go-nostr v0.36.3 h1:50fNFO8vQNMEIZ+6qUq0M5hlqEtA13WrtrKcz10eg9k= -github.com/nbd-wtf/go-nostr v0.36.3/go.mod h1:TGKGj00BmJRXvRe0LlpDN3KKbELhhPXgBwUEhzu3Oq0= -github.com/nbd-wtf/go-nostr v0.37.2 h1:42rriFqqz07EdydERwYeQnewl+Rah1Gq46I+Wh0KYYg= -github.com/nbd-wtf/go-nostr v0.37.2/go.mod h1:TGKGj00BmJRXvRe0LlpDN3KKbELhhPXgBwUEhzu3Oq0= +github.com/nbd-wtf/go-nostr v0.37.3 h1:p/rrOWhaAk78UCVwzWtTN1C8WbP2k5eQV4HlpEYAeeA= +github.com/nbd-wtf/go-nostr v0.37.3/go.mod h1:TGKGj00BmJRXvRe0LlpDN3KKbELhhPXgBwUEhzu3Oq0= 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= @@ -307,7 +298,6 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/import.go b/import.go index 40a3af8..bbf185d 100644 --- a/import.go +++ b/import.go @@ -12,12 +12,13 @@ import ( const layout = "2006-01-02" -var ownerImportedNotes = 0 -var taggedImportedNotes = 0 +var ( + ownerImportedNotes = 0 + taggedImportedNotes = 0 +) func importOwnerNotes() { ctx := context.Background() - pool = nostr.NewSimplePool(ctx) wdb := eventstore.RelayWrapper{Store: &outboxDB} startTime, err := time.Parse(layout, config.ImportStartDate) @@ -59,7 +60,6 @@ func importOwnerNotes() { func importTaggedNotes() { ctx := context.Background() - pool = nostr.NewSimplePool(ctx) wdb := eventstore.RelayWrapper{Store: &inboxDB} startTime, err := time.Parse(layout, config.ImportStartDate) @@ -115,7 +115,6 @@ func importTaggedNotes() { func subscribeInbox() { ctx := context.Background() wdb := eventstore.RelayWrapper{Store: &inboxDB} - pool = nostr.NewSimplePool(ctx) filters := []nostr.Filter{{ Tags: nostr.TagMap{ "p": {nPubToPubkey(config.OwnerNpub)}, diff --git a/main.go b/main.go index 6d3f097..91bd2c4 100644 --- a/main.go +++ b/main.go @@ -13,10 +13,12 @@ import ( "github.com/puzpuzpuz/xsync/v3" ) -var mainRelay = khatru.NewRelay() -var subRelays = xsync.NewMapOf[string, *khatru.Relay]() -var pool *nostr.SimplePool -var config = loadConfig() +var ( + mainRelay = khatru.NewRelay() + subRelays = xsync.NewMapOf[string, *khatru.Relay]() + pool = nostr.NewSimplePool(context.Background()) + config = loadConfig() +) func main() { importFlag := flag.Bool("import", false, "Run the importNotes function after initializing relays") @@ -29,20 +31,24 @@ func main() { log.Println("🚀 haven is booting up") initRelays() - refreshTrustNetwork() + go func() { + refreshTrustNetwork() - if *importFlag { - log.Println("📦 importing notes") - importOwnerNotes() - importTaggedNotes() - return - } + if *importFlag { + log.Println("📦 importing notes") + importOwnerNotes() + importTaggedNotes() + return + } - go subscribeInbox() - go backupDatabase() + go subscribeInbox() + go backupDatabase() + }() handler := http.HandlerFunc(dynamicRelayHandler) + chatRelay.ServiceURL = "http://localhost:3355/chat" + log.Printf("🔗 listening at http://localhost:3355") http.ListenAndServe("0.0.0.0:3355", handler) } diff --git a/wot.go b/wot.go index c4aca36..fa368ed 100644 --- a/wot.go +++ b/wot.go @@ -8,17 +8,17 @@ import ( "github.com/nbd-wtf/go-nostr" ) -var pubkeyFollowerCount = make(map[string]int) -var oneHopNetwork []string -var wot []string -var wotRelays []string -var wotMap map[string]bool +var ( + pubkeyFollowerCount = make(map[string]int) + oneHopNetwork []string + wot []string + wotRelays []string + wotMap map[string]bool +) func refreshTrustNetwork() { - ctx := context.Background() timeoutCtx, cancel := context.WithTimeout(ctx, 3*time.Second) - pool = nostr.NewSimplePool(ctx) defer cancel() ownerPubkey := nPubToPubkey(config.OwnerNpub) @@ -69,7 +69,6 @@ func refreshTrustNetwork() { } func appendRelay(relay string) { - for _, r := range wotRelays { if r == relay { return @@ -107,14 +106,15 @@ func appendOneHopNetwork(pubkey string) { } func updateWoTMap() { - wotMap = make(map[string]bool) + wotMapTmp := make(map[string]bool) for pubkey, count := range pubkeyFollowerCount { if count >= config.ChatRelayMinimumFollowers { - wotMap[pubkey] = true + wotMapTmp[pubkey] = true appendPubkeyToWoT(pubkey) } } + wotMap = wotMapTmp log.Println("🌐 pubkeys with minimum followers: ", len(wotMap), "keys") }