mirror of
https://github.com/nostr-connect/connect.git
synced 2026-01-31 18:14:20 +01:00
fix bug on event fetching: do not use since is broken
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,3 +5,4 @@ node_modules
|
||||
dist
|
||||
example/.cache/
|
||||
example/.parcel-cache/
|
||||
/relay-data/
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
})();
|
||||
}, []);
|
||||
|
||||
|
||||
69
src/rpc.ts
69
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<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);
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user