From b7e33c512c26c7a8f957b63e110cb8966b3d58e3 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Tue, 23 Feb 2021 00:17:22 -0300 Subject: [PATCH] fix many bugs. --- package.json | 2 +- pool.js | 28 ++++++++++++---------------- relay.js | 41 +++++++++++++++++++++++++---------------- 3 files changed, 38 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 04bff31..a1e8af9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nostr-tools", - "version": "0.4.1", + "version": "0.4.2", "description": "Tools for making a Nostr client.", "main": "index.js", "repository": { diff --git a/pool.js b/pool.js index f0e8f7d..eaf0e9e 100644 --- a/pool.js +++ b/pool.js @@ -15,13 +15,13 @@ export function relayPool(globalPrivateKey) { const activeSubscriptions = {} - const sub = async (id, {cb, filter}) => { + const sub = ({cb, filter}, id = Math.random().toString().slice(2)) => { const subControllers = Object.fromEntries( Object.values(relays) .filter(({policy}) => policy.read) .map(({relay}) => [ relay.url, - relay.sub({filter, cb: event => cb(event, relay)}) + relay.sub({filter, cb: event => cb(event, relay.url)}) ]) ) @@ -29,14 +29,16 @@ export function relayPool(globalPrivateKey) { sub: ({cb = cb, filter = filter}) => Object.entries(subControllers).map(([relayURL, sub]) => [ relayURL, - sub(id, {cb, filter}) + sub({cb, filter}, id) ]), addRelay: relay => { subControllers[relay.url] = relay.sub({cb, filter}) }, removeRelay: relayURL => { - subControllers[relayURL].unsub() - if (Object.keys(subControllers).length === 0) unsub() + if (relayURL in subControllers) { + subControllers[relayURL].unsub() + if (Object.keys(subControllers).length === 0) unsub() + } }, unsub: () => { Object.values(subControllers).forEach(sub => sub.unsub()) @@ -48,7 +50,7 @@ export function relayPool(globalPrivateKey) { } return { - sub: sub.bind(null, Math.random()), + sub, relays, setPrivateKey(privateKey) { globalPrivateKey = privateKey @@ -85,7 +87,7 @@ export function relayPool(globalPrivateKey) { let index = noticeCallbacks.indexOf(cb) if (index !== -1) noticeCallbacks.splice(index, 1) }, - async publish(event, statusCallback) { + async publish(event, statusCallback = (status, relayURL) => {}) { if (!event.sig) { event.tags = event.tags || [] @@ -103,15 +105,9 @@ export function relayPool(globalPrivateKey) { .filter(({policy}) => policy.write) .map(async ({relay}) => { try { - await relay.publish(event) - statusCallback(0, relay.url) - let {unsub} = relay.sub({ - cb: () => { - statusCallback(1, relay.url) - }, - filter: {id: event.id} - }) - setTimeout(unsub, 5000) + await relay.publish(event, status => + statusCallback(status, relay.url) + ) } catch (err) { statusCallback(-1, relay.url) } diff --git a/relay.js b/relay.js index 41bb652..4d6cfce 100644 --- a/relay.js +++ b/relay.js @@ -1,7 +1,6 @@ import 'websocket-polyfill' import {verifySignature} from './event' -import {sha256} from './utils' export function normalizeRelayURL(url) { let [host, ...qs] = url.split('?') @@ -59,11 +58,6 @@ export function relayConnect(url, onNotice) { } if (data.length > 1) { - if (data === 'PING') { - ws.send('PONG') - return - } - if (data[0] === 'NOTICE') { if (data.length < 2) return @@ -83,10 +77,7 @@ export function relayConnect(url, onNotice) { channels[channel](event) } } else { - console.warn( - 'got event with invalid signature from ' + url, - event - ) + console.warn('got event with invalid signature from ' + url, event) } return } @@ -115,13 +106,19 @@ export function relayConnect(url, onNotice) { } } - const sub = async ({ch, cb, filter}) => { - const channel = ch || (await sha256(Math.random().toString())).reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '') - trySend(['REQ', channel, filter]) + const sub = ({cb, filter}, channel = Math.random().toString().slice(2)) => { + var filters = [] + if (Array.isArray(filter)) { + filters = filter + } else { + filters.push(filter) + } + + trySend(['REQ', channel, ...filters]) channels[channel] = cb return { - sub: ({cb = cb, filter = filter}) => sub({ch: channel, cb, filter}), + sub: ({cb = cb, filter = filter}) => sub({cb, filter}, channel), unsub: () => trySend(['CLOSE', channel]) } } @@ -129,8 +126,20 @@ export function relayConnect(url, onNotice) { return { url, sub, - async publish(event) { - trySend(['EVENT', event]) + async publish(event, statusCallback = status => {}) { + try { + await trySend(['EVENT', event]) + statusCallback(0) + let {unsub} = relay.sub({ + cb: () => { + statusCallback(1) + }, + filter: {id: event.id} + }) + setTimeout(unsub, 5000) + } catch (err) { + statusCallback(-1) + } }, close() { ws.close()