useSignerStream: rework with nostr-machina

This commit is contained in:
Alex Gleason
2023-10-04 17:19:19 -05:00
parent 84ca2a269d
commit 3cebd961ca
3 changed files with 69 additions and 39 deletions

View File

@@ -1,6 +1,7 @@
import { relayInit, type Relay } from 'nostr-tools';
import { useEffect } from 'react';
import { NiceRelay } from 'nostr-machina';
import { useEffect, useMemo } from 'react';
import { nip04, signEvent } from 'soapbox/features/nostr/sign';
import { useInstance } from 'soapbox/hooks';
import { connectRequestSchema } from 'soapbox/schemas/nostr';
import { jsonSchema } from 'soapbox/schemas/utils';
@@ -11,47 +12,50 @@ function useSignerStream() {
const relayUrl = instance.nostr?.relay;
const pubkey = instance.nostr?.pubkey;
useEffect(() => {
let relay: Relay | undefined;
if (relayUrl && pubkey && window.nostr?.nip04) {
relay = relayInit(relayUrl);
relay.connect();
relay
.sub([{ kinds: [24133], authors: [pubkey], limit: 0 }])
.on('event', async (event) => {
if (!relay || !window.nostr?.nip04) return;
const decrypted = await window.nostr.nip04.decrypt(pubkey, event.content);
const reqMsg = jsonSchema.pipe(connectRequestSchema).safeParse(decrypted);
if (!reqMsg.success) {
console.warn(decrypted);
console.warn(reqMsg.error);
return;
}
const signed = await window.nostr.signEvent(reqMsg.data.params[0]);
const respMsg = {
id: reqMsg.data.id,
result: signed,
};
const respEvent = await window.nostr.signEvent({
kind: 24133,
content: await window.nostr.nip04.encrypt(pubkey, JSON.stringify(respMsg)),
tags: [['p', pubkey]],
created_at: Math.floor(Date.now() / 1000),
});
relay.publish(respEvent);
});
const relay = useMemo(() => {
if (relayUrl) {
return new NiceRelay(relayUrl);
}
}, [relayUrl]);
useEffect(() => {
if (!relay || !pubkey) return;
const sub = relay.req([{ kinds: [24133], authors: [pubkey], limit: 0 }]);
const readEvents = async () => {
for await (const event of sub) {
const decrypted = await nip04.decrypt(pubkey, event.content);
const reqMsg = jsonSchema.pipe(connectRequestSchema).safeParse(decrypted);
if (!reqMsg.success) {
console.warn(decrypted);
console.warn(reqMsg.error);
return;
}
const respMsg = {
id: reqMsg.data.id,
result: await signEvent(reqMsg.data.params[0]),
};
const respEvent = await signEvent({
kind: 24133,
content: await nip04.encrypt(pubkey, JSON.stringify(respMsg)),
tags: [['p', pubkey]],
created_at: Math.floor(Date.now() / 1000),
});
relay.send(['EVENT', respEvent]);
}
};
readEvents();
return () => {
relay?.close();
};
}, [relayUrl, pubkey]);
}, [relay, pubkey]);
}
export { useSignerStream };