diff --git a/.gitignore b/.gitignore index d8e43e2..3cd86b4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ node_modules dist example/.cache/ example/.parcel-cache/ +/relay-data/ diff --git a/example/index.tsx b/example/index.tsx index 865adef..d9b4aee 100644 --- a/example/index.tsx +++ b/example/index.tsx @@ -25,7 +25,10 @@ const App = () => { useEffect(() => { (async () => { - await server.listen(); + const sub = await server.listen(); + sub.on('event', (evt) => { + console.log('server received message', evt); + }); })(); }, []); diff --git a/src/rpc.ts b/src/rpc.ts index 6e59cad..99e7f31 100644 --- a/src/rpc.ts +++ b/src/rpc.ts @@ -1,6 +1,5 @@ import { relayInit, - Relay, getEventHash, signEvent, validateEvent, @@ -23,13 +22,13 @@ export interface NostrRPCResponse { } export class NostrRPC { - relay: Relay; + relay: string; self: { pubkey: string; secret: string }; // this is for implementing the response handlers for each method [key: string]: any; constructor(opts: { relay?: string; secretKey: string }) { - this.relay = relayInit(opts.relay || 'wss://nostr.vulpem.com'); + this.relay = opts.relay || 'wss://nostr.vulpem.com'; this.self = { pubkey: getPublicKey(opts.secretKey), secret: opts.secretKey, @@ -47,43 +46,47 @@ export class NostrRPC { params?: any[]; }; }): Promise { + const relay = await relayInit(this.relay); // prepare request to be sent const request = prepareRequest(id, method, params); const event = await prepareEvent(this.self.secret, target, request); // connect to relay - await this.relay.connect(); + await relay.connect(); + await new Promise((resolve, reject) => { + relay.on('connect', () => { + resolve(); + }); + relay.on('error', () => { + reject(`not possible to connect to ${relay.url}`); + }); + }); // send request via relay - try { - await new Promise(async (resolve, reject) => { - this.relay.on('error', () => { - reject(`failed to connect to ${this.relay.url}`); - }); - const pub = this.relay.publish(event); - pub.on('failed', (reason: any) => { - reject(reason); - }); - pub.on('seen', () => { - console.log(`seen`, event.id, request); - resolve(); - }); + await new Promise((resolve, reject) => { + relay.on('error', () => { + reject(`failed to connect to ${relay.url}`); }); - } catch (err) { - throw err; - } + const pub = relay.publish(event); + pub.on('failed', (reason: any) => { + reject(reason); + }); + pub.on('seen', () => { + resolve(); + }); + }); // waiting for response from remote return new Promise((resolve, reject) => { - const queries = [ + let sub = relay.sub([ { kinds: [4], authors: [target], '#p': [this.self.pubkey], - since: event.created_at, + limit: 1, }, - ]; - let sub = this.relay.sub(queries); + ]); + sub.on('event', async (event: Event) => { let payload; try { @@ -104,8 +107,6 @@ export class NostrRPC { // ignore all the events that are not for this request if (payload.id !== id) return; - console.log(`response`, event.id, payload); - // if the response is an error, reject the promise if (payload.error) { reject(payload.error); @@ -120,21 +121,22 @@ export class NostrRPC { } async listen(): Promise { - await this.relay.connect(); + const relay = relayInit(this.relay); + await relay.connect(); await new Promise((resolve, reject) => { - this.relay.on('connect', () => { + relay.on('connect', () => { resolve(); }); - this.relay.on('error', () => { - reject(`not possible to connect to ${this.relay.url}`); + relay.on('error', () => { + reject(`not possible to connect to ${relay.url}`); }); }); - let sub = this.relay.sub([ + let sub = relay.sub([ { kinds: [4], '#p': [this.self.pubkey], - since: now() - 1, + since: now(), }, ]); @@ -156,7 +158,6 @@ export class NostrRPC { if (!isValidRequest(payload)) return; // handle request - if (!this.hasOwnProperty(payload.method)) return; const response = await this.handleRequest(payload); const body = prepareResponse( @@ -173,7 +174,7 @@ export class NostrRPC { // send response via relay await new Promise((resolve, reject) => { - const pub = this.relay.publish(responseEvent); + const pub = relay.publish(responseEvent); pub.on('failed', (reason: any) => { reject(reason); }); diff --git a/test/connect.test.ts b/test/connect.test.ts index 06174c9..c3e7ea7 100644 --- a/test/connect.test.ts +++ b/test/connect.test.ts @@ -2,7 +2,7 @@ import { getPublicKey } from 'nostr-tools'; import { Connect, ConnectURI, NostrRPC } from '../src'; import { sleep } from './utils'; -jest.setTimeout(8000); +jest.setTimeout(5000); // web app (this is ephemeral and represents the currention session) const webSK = @@ -49,9 +49,12 @@ describe('Nostr Connect', () => { expect(testHandler).toBeCalledTimes(1); }); - it('returns pubkey', async () => { + it.only('returns pubkey', async () => { // start listening for connect messages on the mobile app - const remoteHandler = new MobileHandler({ secretKey: mobileSK }); + const remoteHandler = new MobileHandler({ + secretKey: mobileSK, + relay: 'wss://nostr.vulpem.com', + }); await remoteHandler.listen(); await sleep(1000); diff --git a/test/rpc.test.ts b/test/rpc.test.ts index 75660a4..5bcb1be 100644 --- a/test/rpc.test.ts +++ b/test/rpc.test.ts @@ -10,7 +10,7 @@ class Server extends NostrRPC { jest.setTimeout(5000); describe('Nostr RPC', () => { - it('starts a server', async () => { + it('ping pong', async () => { const server = new Server({ secretKey: 'ed779ff047f99c95f732b22c9f8f842afb870c740aab591776ebc7b64e83cf6c', @@ -22,7 +22,7 @@ describe('Nostr RPC', () => { '5acff99d1ad3e1706360d213fd69203312d9b5e91a2d5f2e06100cc6f686e5b3', }); - await sleep(2000); + await sleep(1000); const result = await client.call({ target: server.self.pubkey,