fix bug on event fetching: do not use since is broken

This commit is contained in:
tiero
2023-01-03 03:13:50 +01:00
parent 0a85d00deb
commit 7378c314d7
5 changed files with 48 additions and 40 deletions

1
.gitignore vendored
View File

@@ -5,3 +5,4 @@ node_modules
dist
example/.cache/
example/.parcel-cache/
/relay-data/

View File

@@ -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);
});
})();
}, []);

View File

@@ -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<any> {
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<void>((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<void>(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<void>((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<void>((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<Sub> {
await this.relay.connect();
const relay = relayInit(this.relay);
await relay.connect();
await new Promise<void>((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<void>((resolve, reject) => {
const pub = this.relay.publish(responseEvent);
const pub = relay.publish(responseEvent);
pub.on('failed', (reason: any) => {
reject(reason);
});

View File

@@ -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);

View File

@@ -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,