This commit is contained in:
tiero
2023-01-06 01:21:02 +01:00
parent 443d2d3c49
commit ed85be4468
2 changed files with 45 additions and 82 deletions

View File

@@ -1,15 +1,15 @@
import {
relayInit,
Event,
Filter,
getEventHash,
signEvent,
validateEvent,
verifySignature,
getPublicKey,
nip04,
Event,
Sub,
Filter,
Relay,
relayInit,
signEvent,
Sub,
validateEvent,
verifySignature,
} from 'nostr-tools';
export interface NostrRPCRequest {
@@ -65,7 +65,7 @@ export class NostrRPC {
if (opts && opts.skipResponse === true) return Promise.resolve();
return new Promise<void>((resolve, reject) => {
let sub = relay.sub([
const sub = relay.sub([
{
kinds: [4],
authors: [target],
@@ -76,12 +76,9 @@ export class NostrRPC {
sub.on('event', async (event: Event) => {
let payload;
/* eslint-disable @typescript-eslint/no-unused-vars */
try {
const plaintext = await nip04.decrypt(
this.self.secret,
event.pubkey,
event.content
);
const plaintext = await nip04.decrypt(this.self.secret, event.pubkey, event.content);
if (!plaintext) throw new Error('failed to decrypt event');
payload = JSON.parse(plaintext);
} catch (ignore) {
@@ -110,7 +107,7 @@ export class NostrRPC {
async listen(): Promise<Sub> {
const relay = await connectToRelay(this.relay);
let sub = relay.sub([
const sub = relay.sub([
{
kinds: [4],
'#p': [this.self.pubkey],
@@ -120,12 +117,9 @@ export class NostrRPC {
sub.on('event', async (event: Event) => {
let payload: NostrRPCRequest;
/* eslint-disable @typescript-eslint/no-unused-vars */
try {
const plaintext = await nip04.decrypt(
this.self.secret,
event.pubkey,
event.content
);
const plaintext = await nip04.decrypt(this.self.secret, event.pubkey, event.content);
if (!plaintext) throw new Error('failed to decrypt event');
payload = JSON.parse(plaintext);
} catch (ignore) {
@@ -139,17 +133,9 @@ export class NostrRPC {
if (typeof this[payload.method] !== 'function') Promise.resolve();
const response = await this.handleRequest(payload, event);
const body = prepareResponse(
response.id,
response.result,
response.error
);
const body = prepareResponse(response.id, response.result, response.error);
const responseEvent = await prepareEvent(
this.self.secret,
event.pubkey,
body
);
const responseEvent = await prepareEvent(this.self.secret, event.pubkey, body);
// send response via relay
await new Promise<void>((resolve, reject) => {
@@ -166,10 +152,7 @@ export class NostrRPC {
return sub;
}
private async handleRequest(
request: NostrRPCRequest,
event: Event
): Promise<NostrRPCResponse> {
private async handleRequest(request: NostrRPCRequest, event: Event): Promise<NostrRPCResponse> {
const { id, method, params } = request;
let result = null;
let error = null;
@@ -196,26 +179,20 @@ export function now(): number {
return Math.floor(Date.now() / 1000);
}
export function randomID(): string {
return Math.random()
.toString()
.slice(2);
return Math.random().toString().slice(2);
}
export function prepareRequest(
id: string,
method: string,
params: any[]
): string {
export function prepareRequest(id: string, method: string, params: any[]): string {
return JSON.stringify({
id,
method: method,
params: params,
method,
params,
});
}
export function prepareResponse(id: string, result: any, error: any): string {
return JSON.stringify({
id: id,
result: result,
error: error,
id,
result,
error,
});
}
export async function prepareEvent(
@@ -237,8 +214,8 @@ export async function prepareEvent(
const sig = signEvent(event, secretKey);
const signedEvent = { ...event, id, sig };
let ok = validateEvent(signedEvent);
let veryOk = verifySignature(signedEvent);
const ok = validateEvent(signedEvent);
const veryOk = verifySignature(signedEvent);
if (!ok || !veryOk) {
throw new Error('Event is not valid');
}
@@ -250,12 +227,7 @@ export function isValidRequest(payload: any): boolean {
if (!payload) return false;
const keys = Object.keys(payload);
if (
!keys.includes('id') ||
!keys.includes('method') ||
!keys.includes('params')
)
return false;
if (!keys.includes('id') || !keys.includes('method') || !keys.includes('params')) return false;
return true;
}
@@ -264,12 +236,7 @@ export function isValidResponse(payload: any): boolean {
if (!payload) return false;
const keys = Object.keys(payload);
if (
!keys.includes('id') ||
!keys.includes('result') ||
!keys.includes('error')
)
return false;
if (!keys.includes('id') || !keys.includes('result') || !keys.includes('error')) return false;
return true;
}
@@ -282,7 +249,7 @@ export async function connectToRelay(realayURL: string) {
resolve();
});
relay.on('error', () => {
reject(`not possible to connect to ${relay.url}`);
reject(new Error(`not possible to connect to ${relay.url}`));
});
});
return relay;
@@ -291,7 +258,7 @@ export async function broadcastToRelay(relay: Relay, event: Event) {
// send request via relay
return await new Promise<void>((resolve, reject) => {
relay.on('error', () => {
reject(`failed to connect to ${relay.url}`);
reject(new Error(`failed to connect to ${relay.url}`));
});
const pub = relay.publish(event);
pub.on('failed', (reason: any) => {