Files
nostash/Shared (Extension)/Resources/nostr.js

64 lines
1.7 KiB
JavaScript

window.nostr = {
requests: {},
async getPublicKey() {
return await this.broadcast('getPubKey');
},
async signEvent(event) {
return await this.broadcast('signEvent', event);
},
async getRelays() {
return await this.broadcast('getRelays');
},
// This is here for Alby comatibility. This is not part of the NIP-07 standard.
// I have found at least one site, nostr.band, which expects it to be present.
async enable() {
return { enabled: true };
},
broadcast(kind, payload) {
let reqId = Math.random().toString();
return new Promise((resolve, _reject) => {
this.requests[reqId] = resolve;
console.log(`Event ${reqId}: ${kind}, payload: `, payload);
window.postMessage({ kind, reqId, payload }, '*');
});
},
nip04: {
async encrypt(pubKey, plainText) {
return await window.nostr.broadcast('nip04.encrypt', {
pubKey,
plainText,
});
},
async decrypt(pubKey, cipherText) {
return await window.nostr.broadcast('nip04.decrypt', {
pubKey,
cipherText,
});
},
},
};
window.addEventListener('message', message => {
const validEvents = [
'getPubKey',
'signEvent',
'getRelays',
'nip04.encrypt',
'nip04.decrypt',
].map(e => `return_${e}`);
let { kind, reqId, payload } = message.data;
if (!validEvents.includes(kind)) return;
console.log(`Event ${reqId}: Received payload:`, payload);
window.nostr.requests[reqId](payload);
delete window.nostr.requests[reqId];
});