Ao fazer uma requisição ao relay ele me retorna apenas um evento como resposta, quando eu gostaria de receber alguns ou todos os eventos de um determinado usuário.

Alguém aí estudando o protocolo nostr que pode me ajudar?

Reply to this note

Please Login to reply.

Discussion

Que estranho. 🤔

O padrão é retornar tudo, a menos que você coloque algum filtro.

Para conseguir os eventos de algum determinado npub você deve abrir uma conexão websocket com o relay.

E enviar a requisição.

No formato

["REQ", , , , ...]

Você deve deixar essa String "REQ" como está, escolher um subscription_id pode ser qualquer coisa contanto que seja único, e colocar quais são os filtros. 🤔

Os filtros deve ser json.

Aqui está um exemplo de como consigo todos os eventos do seu npub:

me conecto com um relay que você usa, por exemplo wss://relay.damus.io e envio uma requisição:

["REQ","abc", {"kinds":[1], "authors": ["912aa339f3f0c6401da45ec920e7f4f751c56990c8b4e85c912c4161272ad28d"]}]

abc é meu subscription_id que vou usar até fechar a conexão e o kinds 1 e authors com esses caracteres estranho aí são meus filtros.

Kinds está entre colchetes pois deve ser uma lista, no meu caso só estou interessado no kind 1, e mesma coisa para os authors.

Esses caracteres estranho em authors é o hex do seu npub que eu consegui com uma biblioteca nostr qualquer que decodifica npubs. 😴

Uma possível explicação para isso é voce estar utilizando "limit": 1 🤔

Isso, estou fazendo deste jeito, mas por algum motivo ainda não saiu do jeito que espero.

Outro ponto que me deixar encabulado e essa subscription=arbitrary_string, isso não deveria ser o número informado pelo relay?

Não. Você escolhe, é temporário, só para te indentificar enquanto a conexão estiver aberta.

Pro relay saber para quem enviar os dados.

Está correto, é assi mesmo!

Quando você envia a mensagem para o relay solititando os eventos, você 'seta' um listener "message" que receberá os eventos, porém, recebe evento a evento, e no final vocẽ recebe um "EOSE", que indica o fim da resposta do relay.

Então, vocẽ provavelmente está enviando o "REQ" e setando o listener "message", porém, fechando assim que recebe o primeiro evento, então receberá sempre o primeiro evento e fechar o listener. Você deve enviar o "REQ" e deixar o listener esperando por um tempo limite "timeout", tenho um código de exemplo:

Em typescript fica assim utilizando Promise:

Provavelmente deve ser isso.

Lendo a documentação da lib websocket lá informar que estás questões de comunicação não deveria ser precaução do dev, a lib cuida disso por debaixo dos panos.

Que mesmo que a mensagem seja fragmentada a lib pegar todas as partes monta e retorna o resultado. Por isso não me preocupei com essa parte da comunicação.

Vou fazer os testes essa parte do listener

Se não quiser mexer diretamente com websocket tem a lib nostr-tools que é uma mão na roda.

Dá um npm install nostr-tools e npm install ws

E aqui está o código:

Antes só faça uma coisinha, vá em node_modules/nostr-tools/lib/esm/relay.js e coloque import WebSocket from 'ws'

O código:

import { Relay } from 'nostr-tools/relay'

const relay = await Relay.connect('wss://relay.damus.io')

console.log(`connected to ${relay.url}`)

// let's query for an event that exists

const sub = relay.subscribe([

{

"kinds": [1],

"authors": ['912aa339f3f0c6401da45ec920e7f4f751c56990c8b4e85c912c4161272ad28d'],

},

], {

onevent(event) {

console.log('we got the event we wanted:', event.content)

},

oneose() {

sub.close()

}

})

Isso ai grande homem!!!

Imaginei que seria isso mesmo, intuitivamente a gente acha que uma execução só, irá retornar todos os eventos etc..

Ai sim Man, mais um passo pra dominar o protocolo!!

Você recebe apenas um evento por vez no seu listener, se o relay for enviar 100 eventos, ele irá enviar 101 mensagens, sendo 100 com eventos e uma última com um "EOSE" de sinalização do final.