import { WorkQueueItem, processWorkQueue, barrierQueue, unwrap } from "@snort/shared"; import { EventSigner, HexKey, NostrEvent } from ".."; const Nip7Queue: Array = []; processWorkQueue(Nip7Queue); declare global { interface Window { nostr?: { getPublicKey: () => Promise; signEvent: (event: T) => Promise; getRelays?: () => Promise>; nip04?: { encrypt?: (pubkey: HexKey, plaintext: string) => Promise; decrypt?: (pubkey: HexKey, ciphertext: string) => Promise; }; }; } } export class Nip7Signer implements EventSigner { init(): Promise { return Promise.resolve(); } async getPubKey(): Promise { if (!window.nostr) { throw new Error("Cannot use NIP-07 signer, not found!"); } return await barrierQueue(Nip7Queue, () => unwrap(window.nostr).getPublicKey()); } async nip4Encrypt(content: string, key: string): Promise { if (!window.nostr) { throw new Error("Cannot use NIP-07 signer, not found!"); } return await barrierQueue(Nip7Queue, () => unwrap(window.nostr?.nip04?.encrypt).call(window.nostr?.nip04, key, content) ); } async nip4Decrypt(content: string, otherKey: string): Promise { if (!window.nostr) { throw new Error("Cannot use NIP-07 signer, not found!"); } return await barrierQueue(Nip7Queue, () => unwrap(window.nostr?.nip04?.decrypt).call(window.nostr?.nip04, otherKey, content) ); } async nip44Encrypt(content: string, key: string): Promise { throw new Error("Method not implemented."); } async nip44Decrypt(content: string, otherKey: string): Promise { throw new Error("Method not implemented."); } async sign(ev: NostrEvent): Promise { if (!window.nostr) { throw new Error("Cannot use NIP-07 signer, not found!"); } return await barrierQueue(Nip7Queue, () => unwrap(window.nostr).signEvent(ev)); } }