You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.6 KiB
60 lines
1.6 KiB
import { ISigner, TDraftEvent, TNip07 } from '@/types' |
|
|
|
export class Nip07Signer implements ISigner { |
|
private signer: TNip07 | undefined |
|
private pubkey: string | null = null |
|
|
|
async init() { |
|
const checkInterval = 100 |
|
const maxAttempts = 50 |
|
|
|
for (let attempt = 0; attempt < maxAttempts; attempt++) { |
|
if (window.nostr) { |
|
this.signer = window.nostr |
|
return |
|
} |
|
await new Promise((resolve) => setTimeout(resolve, checkInterval)) |
|
} |
|
|
|
throw new Error( |
|
'You need to install a nostr signer extension to login. Such as alby, nostr-keyx or nos2x.' |
|
) |
|
} |
|
|
|
async getPublicKey() { |
|
if (!this.signer) { |
|
throw new Error('Should call init() first') |
|
} |
|
if (!this.pubkey) { |
|
this.pubkey = await this.signer.getPublicKey() |
|
} |
|
return this.pubkey |
|
} |
|
|
|
async signEvent(draftEvent: TDraftEvent) { |
|
if (!this.signer) { |
|
throw new Error('Should call init() first') |
|
} |
|
return await this.signer.signEvent(draftEvent) |
|
} |
|
|
|
async nip04Encrypt(pubkey: string, plainText: string) { |
|
if (!this.signer) { |
|
throw new Error('Should call init() first') |
|
} |
|
if (!this.signer.nip04?.encrypt) { |
|
throw new Error('The extension you are using does not support nip04 encryption') |
|
} |
|
return await this.signer.nip04.encrypt(pubkey, plainText) |
|
} |
|
|
|
async nip04Decrypt(pubkey: string, cipherText: string) { |
|
if (!this.signer) { |
|
throw new Error('Should call init() first') |
|
} |
|
if (!this.signer.nip04?.decrypt) { |
|
throw new Error('The extension you are using does not support nip04 decryption') |
|
} |
|
return await this.signer.nip04.decrypt(pubkey, cipherText) |
|
} |
|
}
|
|
|