From ac698ef67dd3d5d9a2018f51ad618792de2fcc8b Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Thu, 22 Dec 2022 08:52:34 -0300 Subject: [PATCH] make relay.connect() an awaitable thing. --- README.md | 2 +- package.json | 2 +- relay.ts | 114 ++++++++++++++++++++++++++------------------------- 3 files changed, 61 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 747e35e..e45394b 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ import { } from 'nostr-tools' const relay = relayInit('wss://relay.example.com') -relay.connect() +await relay.connect() relay.on('connect', () => { console.log(`connected to ${relay.url}`) diff --git a/package.json b/package.json index 2b32c2c..2fde1bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nostr-tools", - "version": "1.0.0-beta2", + "version": "1.0.0-rc1", "description": "Tools for making a Nostr client.", "repository": { "type": "git", diff --git a/relay.ts b/relay.ts index 48bf68e..5ee7162 100644 --- a/relay.ts +++ b/relay.ts @@ -59,73 +59,77 @@ export function relayInit(url: string): Relay { } } = {} - function connectRelay() { - ws = new WebSocket(url) + async function connectRelay(): Promise { + return new Promise((resolve, reject) => { + ws = new WebSocket(url) - ws.onopen = () => { - listeners.connect.forEach(cb => cb()) - } - ws.onerror = () => { - listeners.error.forEach(cb => cb()) - } - ws.onclose = async () => { - listeners.disconnect.forEach(cb => cb()) - resolveClose() - } - - ws.onmessage = async e => { - var data - try { - data = JSON.parse(e.data) - } catch (err) { - data = e.data + ws.onopen = () => { + listeners.connect.forEach(cb => cb()) + resolve() + } + ws.onerror = () => { + listeners.error.forEach(cb => cb()) + reject() + } + ws.onclose = async () => { + listeners.disconnect.forEach(cb => cb()) + resolveClose() } - if (data.length >= 1) { - switch (data[0]) { - case 'EVENT': - if (data.length !== 3) return // ignore empty or malformed EVENT + ws.onmessage = async e => { + var data + try { + data = JSON.parse(e.data) + } catch (err) { + data = e.data + } - let id = data[1] - let event = data[2] - if ( - validateEvent(event) && - openSubs[id] && - (openSubs[id].skipVerification || verifySignature(event)) && - matchFilters(openSubs[id].filters, event) - ) { - openSubs[id] - subListeners[id]?.event.forEach(cb => cb(event)) + if (data.length >= 1) { + switch (data[0]) { + case 'EVENT': + if (data.length !== 3) return // ignore empty or malformed EVENT + + let id = data[1] + let event = data[2] + if ( + validateEvent(event) && + openSubs[id] && + (openSubs[id].skipVerification || verifySignature(event)) && + matchFilters(openSubs[id].filters, event) + ) { + openSubs[id] + subListeners[id]?.event.forEach(cb => cb(event)) + } + return + case 'EOSE': { + if (data.length !== 2) return // ignore empty or malformed EOSE + let id = data[1] + subListeners[id]?.eose.forEach(cb => cb()) + return } - return - case 'EOSE': { - if (data.length !== 2) return // ignore empty or malformed EOSE - let id = data[1] - subListeners[id]?.eose.forEach(cb => cb()) - return + case 'OK': { + if (data.length < 3) return // ignore empty or malformed OK + let id: string = data[1] + let ok: boolean = data[2] + let reason: string = data[3] || '' + if (ok) pubListeners[id]?.ok.forEach(cb => cb()) + else pubListeners[id]?.failed.forEach(cb => cb(reason)) + return + } + case 'NOTICE': + if (data.length !== 2) return // ignore empty or malformed NOTICE + let notice = data[1] + listeners.notice.forEach(cb => cb(notice)) + return } - case 'OK': { - if (data.length < 3) return // ignore empty or malformed OK - let id: string = data[1] - let ok: boolean = data[2] - let reason: string = data[3] || '' - if (ok) pubListeners[id]?.ok.forEach(cb => cb()) - else pubListeners[id]?.failed.forEach(cb => cb(reason)) - return - } - case 'NOTICE': - if (data.length !== 2) return // ignore empty or malformed NOTICE - let notice = data[1] - listeners.notice.forEach(cb => cb(notice)) - return } } - } + }) } async function connect(): Promise { if (ws?.readyState && ws.readyState === 1) return // ws already open - connectRelay() + await connectRelay() } async function trySend(params: [string, ...any]) {