|
|
|
@ -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;
|
|
|
|
|
|
|
|
|
|
const relay = useMemo(() => {
|
|
|
|
|
if (relayUrl) {
|
|
|
|
|
return new NiceRelay(relayUrl);
|
|
|
|
|
}
|
|
|
|
|
}, [relayUrl]);
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
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 };
|
|
|
|
|